Cod sursa(job #1333892)

Utilizator avaspAva Spataru avasp Data 3 februarie 2015 18:12:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 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||v[l[lm]]<x){
        lm++;
        return lm;
    }
    l1=1;
    l2=lm;
    ret=0;
    while(l1<=l2){
        m=(l1+l2)/2;
        if(v[l[m]]==x)
            return m;
        if(v[l[m]]<x){
            l1=m+1;
            ret=m;
        }
        else
        if(v[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]);
        poz=caut(v[i]);
        l[poz]=i;
        tata[i]=l[poz-1];
    }
    printf("%d\n",lm);
    int  afis=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;
}