Pagini recente » Cod sursa (job #2763706) | Cod sursa (job #2888194) | Cod sursa (job #2114981) | Cod sursa (job #345309) | Cod sursa (job #440556)
Cod sursa(job #440556)
/*
a[] -> numere din sir
lung[i] -> lung celui mai lung subsir care se termina cu a[i]
*/
#include<cstdio>
const int N=1<<17;
int a[N],lung[N],pred[N],nr;
void scrie(int i)
{
if (i==0) return ;
scrie(pred[i]);
printf("%d ",a[i]);
}
int cautbin(int x)
{
int i,pas=1<<17;
for (i=0;pas;pas>>=1)
if (i+pas<=nr && a[lung[i+pas]]<x)
i+=pas;
return i+1;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
lung[1]=1;
nr=1;
for (int i=2;i<=n;i++)
{
int j=cautbin(a[i]);
if (j>nr)
nr++;
lung[j]=i;
if (j!=1)
pred[i]=lung[j-1];
else
pred[i]=0;
}
printf("%d\n",nr);
scrie(lung[nr]);
return 0;
}