Cod sursa(job #1090057)

Utilizator Tudordmdaniel marin Tudordm Data 22 ianuarie 2014 12:07:02
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

const int N = 100001;

int v[N], w[N], x[N], n, i, aib[N], lung, imax, maxim, subsir[N], l[N];

bool cmp(int p1, int p2){

    return v[p1] < v[p2];

}


int query(int p){
    int s=0;
    while(p!=0){
        if(aib[p]>s)
            s=aib[p];

        p-=p&(-p);
    }
    return s+1;
}

void update(int p,int val){

    while(p<=n){
        aib[p]  =   val;
        p+=p&(-p);
        }
}


int main(){

    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d",&n);

    for(i=1;i<=n;i++){

        scanf("%d",&v[i]);
        w[i]=i;

    }
    sort(w+1,w+n+1,cmp);

     for(i = 1; i <= n; i++){
        if(i > 1 && v[w[i]] == v[w[i-1]]){
            x[w[i]] = x[w[i-1]];
        } else {
            x[w[i]] = i;
        }
    }

    for(i=1;i<=n;i++){

        lung=query(x[i]-1);

        if(lung>maxim)
        {
            maxim=lung;
            imax=i;
        }
        update(x[i],lung);
        l[i]=lung;

    }

    printf("%d\n",maxim);

    lung=maxim;

    int r=0;
    subsir[r] = v[imax];

    for(i=n; i>=1;i--){

        if(l[i]==lung-1){

            subsir[++r] = v[i];
            lung--;
        }
    }

    for(i=maxim-1;i>=0;i--){

        printf("%d ",&subsir[i]);

    }

    return 0;
}