Pagini recente » Cod sursa (job #1620960) | Cod sursa (job #660456) | Cod sursa (job #2333970) | Cod sursa (job #865346) | Cod sursa (job #2589897)
#include <bits/stdc++.h>
using namespace std;
int n,v[100003],best[100003],sir[100003],poz,kontor,ans,aux,sol[100005];
int cb (int nr) {
int i=0,step=1;
for(;(step<<1)<=kontor;step<<=1);
for(;step>0;step>>=1)
if(i+step<=kontor && sir[i+step]<nr)
i+=step;
return i;
}
void scmax () {
best[1]=1;sir[++kontor]=v[1];
for(int i=2;i<=n;++i) {
poz=cb(v[i]);
if(poz==kontor)
best[i]=kontor+1,sir[++kontor]=v[i];
else
best[i]=poz+1,sir[poz+1]=v[i];
}
for(int i=1;i<=n;++i)
if(best[i]>ans)
ans=best[i],poz=i;
aux=ans-1;sol[++sol[0]]=v[poz];
for(int i=poz-1;i>0 && aux>0;--i)
if(best[i]==aux && v[i]<sol[sol[0]])
sol[++sol[0]]=v[i],--aux;
printf("%d\n", ans);
for(int i=sol[0];i>0;--i)
printf("%d ", sol[i]);
}
int main () {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for(int i=1;i<=n;++i)
scanf("%d", &v[i]);
scmax();
return 0;
}