Pagini recente » Cod sursa (job #1069950) | Cod sursa (job #405833) | Cod sursa (job #1946030) | Cod sursa (job #27015) | Cod sursa (job #1464500)
#include<cstdio>
#include<algorithm>
using namespace std;
int n,vn[100005],v[100005],lst[100005],lmax[100005],aib[100005],up[100005];
void update(int x,int poz){
for(x;x<=n;x+=(x^(x-1)&x))
if(lmax[poz]>lmax[aib[x]])
aib[x]=poz;
}
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;
}
int main(){
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i,h=1,maxim=-1,poz;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&v[i]);
vn[i]=lst[i]=v[i];
}
sort(lst+1,lst+n+1);
for(i=2;i<=n;i++)
if(lst[i]!=lst[h])
lst[++h]=lst[i];
for(i=1;i<=n;i++)
vn[i]=lower_bound(lst+1,lst+h+1,v[i])-lst;
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;
}
}
printf("%d\n",maxim);
for(i=maxim;i>=1;i--){
lst[i]=v[poz];
poz=up[poz];
}
for(i=1;i<=maxim;i++)
printf("%d ",lst[i]);
return 0;
}