Pagini recente » Cod sursa (job #242918) | Cod sursa (job #1309058) | Cod sursa (job #2834866) | Cod sursa (job #2681551) | Cod sursa (job #883064)
Cod sursa(job #883064)
#include<stdio.h>
#define MAXN 1000001
using namespace std;
int poz[MAXN], v[MAXN], elem[MAXN], sol[MAXN], reconst[MAXN];
int cautbinar(int st,int dr,int x){
int m,lungime;
while(st<=dr)
{
m=(st+dr)/2;
if(elem[m]<x)
{ lungime=m;
st=m+1;
}
else
{
dr=m-1;
}
}
return lungime;
}
int main()
{int i,n,lungime,maxim;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
elem[0]=-2000000000;
lungime=0;
for(i=1;i<=n;i++)
{ maxim=cautbinar(0,lungime,v[i]);
elem[maxim+1]=v[i];
if(maxim+1>lungime)
lungime=maxim+1;
poz[maxim+1]=i;
sol[i]=poz[maxim];
}
printf("%d\n",lungime);
reconst[lungime]=elem[lungime];
int x;
x=poz[lungime];
for(i=lungime-1;i>=1;i--)
{ x=sol[x];
reconst[i]=v[x];
}
for(i=1;i<=lungime;i++)
printf("%d ",reconst[i]);
return 0;
}