Cod sursa(job #1375996)

Utilizator teoionescuIonescu Teodor teoionescu Data 5 martie 2015 15:24:54
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int Nmax = 100001;
pair<int,int> p[Nmax];
int A[Nmax],w[Nmax];
int N,v[Nmax],nm[Nmax];
int pr[Nmax],d[Nmax];
int lsb(int &x){return (x&(-x));}
void update(int x,int &val,int &pos){
    while(x<=N){
        if(val>A[x]){
            A[x]=val;
            w[x]=pos;
        }
        x+=lsb(x);
    }
}
int query(int x){
    int s=0,f=-1;
    while(x){
        if(A[x]>s){
            s=A[x];
            f=w[x];
        }
        x-=lsb(x);
    }
    return f;
}
int main(){
    in>>N;
    for(int i=1;i<=N;i++) in>>v[i],p[i]=make_pair(v[i],i);
    sort(p+1,p+N+1);
    int k=0;
    for(int i=1;i<=N;i++){
        if(p[i].first!=p[i-1].first) k++;
        nm[p[i].second]=k;
    }
    for(int i=1;i<=N;i++){
        pr[i]=query(nm[i]-1);
        if(pr[i]==-1) d[i]=1;
        else d[i]=d[pr[i]]+1;
        update(nm[i],d[i],i);
    }
    int s=0,f=-1;
    for(int i=1;i<=N;i++) if(d[i]>s) s=d[i],f=i;
    out<<s<<'\n';
    A[0]=0;
    while(f!=-1){
        A[++A[0]]=v[f];
        f=pr[f];
    }
    for(int i=A[0];i>1;i--) out<<A[i]<<' '; out<<A[1]<<'\n';
    return 0;
}