Cod sursa(job #328101)

Utilizator hendrikHendrik Lai hendrik Data 1 iulie 2009 02:20:37
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
using namespace std;

#define MAXN 100001
int n,lst[MAXN],Res[MAXN],v[MAXN],up[MAXN],D[MAXN],AIB[MAXN],bst,ans,h;

void update(int x,int ind){
    for (;x<=n;x+=(x & -x)){
        if (D[ind]>D[AIB[x]]) AIB[x]=ind;
    }
}

int query(int x){
    int mx=0;
    for (;x;x-=(x & -x)){
        if (D[AIB[x]]>D[mx]) mx=AIB[x];
    }
    return mx;
}

int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++){
        scanf("%d",&Res[i]);
        lst[i]=Res[i];
    }
    sort(lst+1,lst+1+n);
    for (int i=1;i<=n;i++) v[i]=lower_bound(lst+1,lst+1+n,Res[i])-lst;
    for (int i=1;i<=n;i++){
        up[i]=query(v[i]-1);
        D[i]=D[up[i]]+1;
        update(v[i],i);
    }
    bst=ans=0;
    for (int i=1;i<=n;i++){
        if (D[i]>D[bst]){
            bst=i;
            ans=D[i];
        }
    }
    printf("%d\n",ans);
    h=0;
    for (int i=bst;i;i=up[i]){
        lst[h++]=Res[i];
    }
    for (int i=h-1;i>=0;i--){
        printf("%d ",lst[i]);
    }
    printf("\n");
    //system("pause");
    return 0;
}