Pagini recente » Cod sursa (job #2597929) | Cod sursa (job #1791347) | Cod sursa (job #2062502) | Cod sursa (job #2134709) | Cod sursa (job #328101)
Cod sursa(job #328101)
#include <iostream>
using namespace std;
#define MAXN 100001
int n,lst[MAXN],Res[MAXN],v[MAXN],up[MAXN],D[MAXN],AIB[MAXN],bst,ans,h;
void update(int x,int ind){
for (;x<=n;x+=(x & -x)){
if (D[ind]>D[AIB[x]]) AIB[x]=ind;
}
}
int query(int x){
int mx=0;
for (;x;x-=(x & -x)){
if (D[AIB[x]]>D[mx]) mx=AIB[x];
}
return mx;
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d",&Res[i]);
lst[i]=Res[i];
}
sort(lst+1,lst+1+n);
for (int i=1;i<=n;i++) v[i]=lower_bound(lst+1,lst+1+n,Res[i])-lst;
for (int i=1;i<=n;i++){
up[i]=query(v[i]-1);
D[i]=D[up[i]]+1;
update(v[i],i);
}
bst=ans=0;
for (int i=1;i<=n;i++){
if (D[i]>D[bst]){
bst=i;
ans=D[i];
}
}
printf("%d\n",ans);
h=0;
for (int i=bst;i;i=up[i]){
lst[h++]=Res[i];
}
for (int i=h-1;i>=0;i--){
printf("%d ",lst[i]);
}
printf("\n");
//system("pause");
return 0;
}