Cod sursa(job #2296047)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 decembrie 2018 10:54:30
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define mkp make_pair
#define a first
#define b second
#define NMAX 100005
#define per pair<int,int>
using namespace std;
ifstream si("scmax.in");
ofstream so("scmax.out");
per aib[NMAX],v[NMAX];
int p[NMAX],r[NMAX],sol[NMAX];
int n;
void update(int poz,int x,int xpoz) {
    for(;poz<=n;poz+=poz&(-poz)) {
        if(aib[poz].a<x) {
            aib[poz].a=x;
            aib[poz].b=xpoz;
        }
    }
}
per querry(int poz) {
    int m,mpoz;
    for(m=0;poz;poz-=poz&(-poz)) {
        if(aib[poz].a>m) {
            m=aib[poz].a;
            mpoz=aib[poz].b;
        }
    }
    return mkp(m,mpoz);
}
int main() {
    si>>n;
    for(int i=1;i<=n;++i) {
        si>>v[i].a;
        v[i].b=-i;
        r[i]=v[i].a;
    }
    sort(v+1,v+1+n);
    per q;
    int m=0,mpoz;
    for(int i=1;i<=n;++i) {
        q=querry(-v[i].b);
        if(q.a+1>m) {
            m=q.a+1;
            mpoz=-v[i].b;
        }
        p[-v[i].b]=q.b;
        update(-v[i].b,q.a+1,-v[i].b);
    }
    so<<m<<'\n';
    n=m;
    for(m=0;n--;mpoz=p[mpoz],m++)
        sol[m]=r[mpoz];
    while(m--)
        so<<sol[m]<<' ';
    so.close();
    return 0;
}