Cod sursa(job #393950)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 10 februarie 2010 11:20:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include<cstdio>
int n,a[100001],pred[100001],vec[100001],x[100001];
int scan(int poz)
{
    int i=0,pas=1<<17;
    for(i=0;pas;pas>>=1)
        if(x[0]>=i+pas && a[x[i+pas]]<poz)
			i+=pas;
	return i+1;
}
void scrie(int poz)
{
    if(pred[poz])
        scrie(pred[poz]);
    printf("%d ",a[poz]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int j;
	x[++x[0]]=1;
	for(int i=2;i<=n;i++)
    {
        j=scan(a[i]);
		if(j>x[0])
			++x[0];
		x[j]=i;
		if(j!=1)
            pred[i]=x[j-1];
        else pred[i]=0;
    }
	printf("%d\n",x[0]);
	scrie(x[x[0]]);
    return 0;
}