Pagini recente » Cod sursa (job #2448557) | Cod sursa (job #173307) | Cod sursa (job #2189974) | Cod sursa (job #1031629) | Cod sursa (job #1464466)
#include<cstdio>
#include<algorithm>
using namespace std;
struct thing{int val,poz;};
thing v0[100010];
int v[100010],vn[100010],aib[100010],lmax[100010],up[100010],sol[100010];
bool cmp(thing a,thing b){
if(a.val<b.val)
return true;
return false;
}
int query(int x){
int poz=0;
for(x;x>0;x-=(x&(x-1))^x)
if(lmax[aib[x]]>lmax[poz])
poz=aib[x];
return poz;
}
void update(int x,int poz){
for(x;x<=100000;x+=(x&(x-1))^x)
if(lmax[poz]>lmax[aib[x]])
aib[x]=poz;
}
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i,maxim=-1,poz;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&v[i]);
v0[i].val=v[i];
v0[i].poz=i;
}
sort(v0+1,v0+n+1,cmp);
v0[0].val=-1;
for(i=1;i<=n;i++)
if(v0[i].val!=v0[i-1].val)
vn[v0[i].poz]=i;
else
vn[v0[i].poz]=vn[v0[i-1].poz];
for(i=1;i<=n;i++){
up[i]=query(vn[i]-1);
lmax[i]=lmax[up[i]]+1;
update(vn[i],i);
if(lmax[i]>maxim){
maxim=lmax[i];
poz=i;
}
}
for(i=maxim;i>=1;i--){
sol[i]=v[poz];
poz=up[poz];
}
printf("%d\n",maxim);
for(i=1;i<=maxim;i++)
printf("%d ",sol[i]);
return 0;
}