Cod sursa(job #950201)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 16 mai 2013 09:09:38
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<cstdio>
using namespace std;
int i, n, a[100001], s[100001], v[100001], mij, st, dr, poz, sol[100001];
int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d", &n); scanf("%d", &a[1]); s[1]=1; v[1]=a[1]; v[0]=1;
    for (i=2;i<=n;i++) {
        scanf("%d", &a[i]);
        st=1; dr=v[0];
        while (st<dr) {
            mij=(st+dr)/2;
            if (v[mij]<=s[i]) dr=mij-1; else st=mij+1;
        }
        if (v[st]>=a[i]) {v[st]=a[i]; s[i]=st; if (st==v[0]) poz=i;}
            else {v[st+1]=a[i]; s[i]=st+1; if (st+1>v[0]) v[0]=st+1; poz=i;}
    }
    printf("%d\n", v[0]); sol[1]=a[poz]; sol[0]=1; v[0]--;
        for (i=poz-1;i>=1;i--) if (s[i]==v[0]) {sol[++sol[0]]=a[i]; v[0]--;}
    printf("%d", sol[sol[0]]);
        for (i=sol[0]-1;i>=1;i--) printf(" %d", sol[i]);
    printf("\n"); return 0;
}