Cod sursa(job #1333884)

Utilizator avaspAva Spataru avasp Data 3 februarie 2015 18:06:32
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<cstdio>
using namespace std;
int n,v[100001],lm,l[100001],pozi[100001],tata[100001],vec[100001];
int caut(int x){
    int l1,l2,m,ret;
    if(lm==0||l[lm]<x){
        lm++;
        return lm;
    }
    l1=1;
    l2=lm;
    ret=0;
    while(l1<=l2){
        m=(l1+l2)/2;
        if(l[m]==x)
            return m;
        if(l[m]<x){
            l1=m+1;
            ret=m;
        }
        else
        if(l[m]>x)
            l2=m-1;
    }
    return ret+1;
}

int main(){
    int poz;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    lm=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&v[i]);
        pozi[v[i]]=i;
        poz=caut(v[i]);
        l[poz]=v[i];
        tata[i]=pozi[l[poz-1]];
    }
    printf("%d\n",lm);
    int  afis=pozi[l[lm]];
    int i=0;
    while(afis>0){
        //printf("%d ",v[afis]);
        vec[++i]=v[afis];
        afis=tata[afis];
    }
    for(int i=lm;i>=1;i--)
        printf("%d ",vec[i]);
    return 0;
}