Pagini recente » Cod sursa (job #1748137) | Cod sursa (job #1467133) | Cod sursa (job #1415664) | Cod sursa (job #362824) | Cod sursa (job #1545520)
#include <cstdio>
using namespace std;
int n,m,i,poz,lgm,v[100001],lg[100001],b[100001];
int caut(int x) //CAUTARE BINARA POZITIA CELUI MAI MARE NUMAR MAI MIC CA V[i]
{ int m,p=1,u=b[0],mx=0;
while (p<=u)
{ m=(p+u)/2;
if(b[m]<x)
{ if(mx<m) mx=m;
p=m+1;
}
else u=m-1;
}
return mx;
}
int main()
{ freopen("scmax.in","r",stdin); freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&v[i]);
b[1]=v[1]; b[0]=lg[1]=1;
for(i=2;i<=n;++i)
{ poz=caut(v[i]); //cautare pozitie
if(poz==b[0]) b[0]++;
b[poz+1]=v[i]; //completare coada
lg[i]=poz+1;
}
for(poz=0,i=1;i<=n;++i)
if(lg[poz]<lg[i]) poz=i;
printf("%d\n",lg[poz]);
lgm=lg[poz];
for(i=poz;lgm;--i)
if(lg[i]==lgm) {b[++m]=v[i]; --lgm;};
do printf("%d ",b[m--]); while(m);
return 0;
}