Cod sursa(job #1464500)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 23 iulie 2015 18:16:41
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int n,vn[100005],v[100005],lst[100005],lmax[100005],aib[100005],up[100005];
void update(int x,int poz){
    for(x;x<=n;x+=(x^(x-1)&x))
        if(lmax[poz]>lmax[aib[x]])
            aib[x]=poz;
}
int query(int x){
    int poz=0;
    for(x;x>0;x-=(x^(x-1)&x))
        if(lmax[aib[x]]>lmax[poz])
            poz=aib[x];
    return poz;
}
int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int i,h=1,maxim=-1,poz;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&v[i]);
        vn[i]=lst[i]=v[i];
    }
    sort(lst+1,lst+n+1);
    for(i=2;i<=n;i++)
        if(lst[i]!=lst[h])
            lst[++h]=lst[i];
    for(i=1;i<=n;i++)
        vn[i]=lower_bound(lst+1,lst+h+1,v[i])-lst;
    for(i=1;i<=n;i++){
        up[i]=query(vn[i]-1);
        lmax[i]=lmax[up[i]]+1;
        update(vn[i],i);
        if(lmax[i]>maxim){
            maxim=lmax[i];
            poz=i;
        }
    }
    printf("%d\n",maxim);
    for(i=maxim;i>=1;i--){
        lst[i]=v[poz];
        poz=up[poz];
    }
    for(i=1;i<=maxim;i++)
        printf("%d ",lst[i]);
    return 0;
}