Pagini recente » Cod sursa (job #2920946) | Cod sursa (job #10045) | Cod sursa (job #2956547) | Cod sursa (job #1581584) | Cod sursa (job #2578192)
#include <bits/stdc++.h>
using namespace std;
int n,v[100003],aib[100003],a[100003],sol[100003],maxim,best[100003],a1[100005];
int cb (int nr) {
int i=0,step=1;
for(;(step<<1)<=n;step<<=1);
for(;step>0;step>>=1)
if(i+step<=n && a[i+step]<nr)
i+=step;
return i+1;
}
int lsb (int nr) {
return (nr & (-nr));
}
void updatee (int poz, int val ) {
while(poz<=n) {
if(best[val]>best[aib[poz]])
aib[poz]=val;
poz=poz+lsb(poz);
}
}
int querrys (int dr) {
maxim=0;
while(dr>0) {
if(best[aib[dr]]>best[maxim])
maxim=aib[dr];
dr=dr-lsb(dr);
}
return maxim;
}
int main () {
int poz,kontor=0;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for(int i=1;i<=n;++i)
scanf("%d", &v[i]),a[i]=v[i],a1[i]=v[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;++i)
v[i]=cb(v[i]);
for(int i=1;i<=n;++i) {
best[i]=best[querrys(v[i]-1)]+1;
updatee(v[i],i);
}
maxim=-1;poz=0;
for(int i=1;i<=n;++i)
if(best[i]>maxim)
maxim=best[i],poz=i;
sol[++kontor]=a1[poz];
for(int i=poz-1;i>0 && kontor<maxim;--i)
if(best[i]==best[poz]-1 && a1[i]<a[poz])
sol[++kontor]=a1[i],poz=i;
printf("%d\n", maxim);
for(int i=kontor;i>0;--i)
printf("%d ", sol[i]);
return 0;
}