Cod sursa(job #1552485)

Utilizator ipus1Stefan Enescu ipus1 Data 18 decembrie 2015 10:30:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<cstdio>
struct aa{int x,y;};
aa v[100001];
int s[100001];
int main ()
{freopen ("scmax.in","r",stdin);
freopen ("scmax.out","w",stdout);
int n,i,c1,c2,x,nr,k,q;
scanf("%d",&n);
for(i=1;i<=n;i++)
    scanf("%d",&v[i].x);
q=1;
s[0]=1;
s[1]=v[1].x;
v[1].y=1;
for(i=2;i<=n;i++)
    {c1=1;
    c2=s[0];
    k=1;
    while(c1<=c2)
        {x=(c1+c2)/2;
        if(s[x]>=v[i].x)
            {c2=x-1;
            k=x;
            }
        else
            c1=x+1;
        }
    if(s[1]>=v[i].x)
        {v[i].y=1;
        s[1]=v[i].x;
        }
    else
        if(s[s[0]]<v[i].x)
            {s[0]++;
            s[s[0]]=v[i].x;
            v[i].y=s[0];
            }
        else
            {s[k]=v[i].x;
            v[i].y=k;
            }
    if(s[0]>q)
        q=s[0];
    }
printf("%d\n",q);
nr=q;
k=2000000001;
for(i=n;i>=1;i--)
    if(v[i].y==nr&&v[i].x<k)
        {k=v[i].x;
        v[i].y=-1;
        nr--;
        }
for(i=1;i<=n;i++)
    if(v[i].y==-1)
        printf("%d ",v[i].x);
return 0;
}