Pagini recente » Cod sursa (job #749980) | Cod sursa (job #1041071) | Cod sursa (job #95321) | Cod sursa (job #2674307) | Cod sursa (job #567514)
Cod sursa(job #567514)
#include <cstdio>
#include <fstream>
#include <algorithm>
using namespace std;
#define N 100005
int nesrt[N], srt[N],ind[N];
int n;
int V[N], // Valorile din AIB
aib[N]; // Indici din AIB
int que[N]; // un fel de coda
int srch (int x){
int m=0;
for(;x;x-=(x&(-x)))
if(V[aib[x]]>V[m])
m=aib[x];
return m;}
void up (int x,int i){
for(;x<=N;x+=(x&(-x)))
if(V[i]>V[aib[x]])
aib[x]=i;
}
void write (int i){
if(i){
write (que[i]);
printf("%d ",nesrt[i]);
}
}
int main ()
{
ifstream in ("scmax.in");
freopen ("scmax.out","w",stdout);
in>>n;
for(int i=1;i<=n;++i){
in>>ind[i];
nesrt[i]=srt[i]=ind[i];
}
sort(srt+1,srt+n+1);
int m=1;
for(int i=2;i<=n;++i)
if(srt[m]!=srt[i])
srt[++m]=srt[i];
for(int i=1;i<=n;++i)
ind[i]=lower_bound(srt+1,srt+m+1,ind[i])-srt;
for(int i=1;i<=n;++i){
que[i]=srch(ind[i]-1);
V[i]=V[que[i]]+1;
up(ind[i],i);
}
int mm=0;
for(int i=1;i<=n;++i)
if(V[mm]<V[i])
mm=i;
printf("%d\n",V[mm]);
write (mm);
printf("\n");
return 0;}