Cod sursa(job #1464466)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 23 iulie 2015 16:35:41
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct thing{int val,poz;};
thing v0[100010];
int v[100010],vn[100010],aib[100010],lmax[100010],up[100010],sol[100010];
bool cmp(thing a,thing b){
    if(a.val<b.val)
        return true;
    return false;
}
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;
}
void update(int x,int poz){
    for(x;x<=100000;x+=(x&(x-1))^x)
        if(lmax[poz]>lmax[aib[x]])
            aib[x]=poz;
}
int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i,maxim=-1,poz;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&v[i]);
        v0[i].val=v[i];
        v0[i].poz=i;
    }
    sort(v0+1,v0+n+1,cmp);
    v0[0].val=-1;
    for(i=1;i<=n;i++)
        if(v0[i].val!=v0[i-1].val)
            vn[v0[i].poz]=i;
        else
            vn[v0[i].poz]=vn[v0[i-1].poz];
    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;
        }
    }
    for(i=maxim;i>=1;i--){
        sol[i]=v[poz];
        poz=up[poz];
    }
    printf("%d\n",maxim);
    for(i=1;i<=maxim;i++)
        printf("%d ",sol[i]);
    return 0;
}