Pagini recente » Rating Valentin Calin (Calin19) | Cod sursa (job #2756864) | Cod sursa (job #1749362) | Cod sursa (job #2141540) | Cod sursa (job #2145619)
#include<stdio.h>
#include<algorithm>
#include<unordered_map>
#include<deque>
#define INF 100001
using namespace std;
int n;
int a[INF], b[INF], len[INF];
unordered_map<int,int> ind;
int aib[INF];
deque<int> ans;
int tail(int x){
return (x^(x-1))&x;
}
void read_data(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
b[i] = a[i];
}
/*sort(b,b+n);
for(int i=0;i<n;++i)
if(ind.find(b[i])==ind.end())
ind.insert(pair<int,int>(b[i],i));
for(int i=0;i<n;++i)
b[i] = ind.find(a[i])->second+1;*/
}
void ins(int pos,int x){
for(int i=pos;i<=n;i+=tail(i))
if(aib[i]<x)aib[i]=x;
}
int query(int x){
int mx = 0;
for(int i=x;i>0;i-=tail(i))
if(aib[i]>mx)
mx=aib[i];
return mx;
}
int main(){
read_data();
len[0]=1;ins(b[0],1);
int best=1;
for(int i=1;i<n;++i){
len[i] = query(b[i]-1)+1;
if(len[i]>best)best=len[i];
ins(b[i],len[i]);
}
printf("%d\n",best);
int i;
for(i=n-1;i>-1;i--)
if(len[i]==best){ans.push_front(a[i]);best--;break;}
for(i;best>0;--i)
if(len[i]==best&&a[i]<ans[0]){
ans.push_front(a[i]);
best--;
}
for(i=0;i<ans.size();++i)printf("%d ",ans[i]);
return 0;
}