Pagini recente » Cod sursa (job #3004742) | Cod sursa (job #62609) | Cod sursa (job #2118257) | Cod sursa (job #2872463) | Cod sursa (job #1375996)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int Nmax = 100001;
pair<int,int> p[Nmax];
int A[Nmax],w[Nmax];
int N,v[Nmax],nm[Nmax];
int pr[Nmax],d[Nmax];
int lsb(int &x){return (x&(-x));}
void update(int x,int &val,int &pos){
while(x<=N){
if(val>A[x]){
A[x]=val;
w[x]=pos;
}
x+=lsb(x);
}
}
int query(int x){
int s=0,f=-1;
while(x){
if(A[x]>s){
s=A[x];
f=w[x];
}
x-=lsb(x);
}
return f;
}
int main(){
in>>N;
for(int i=1;i<=N;i++) in>>v[i],p[i]=make_pair(v[i],i);
sort(p+1,p+N+1);
int k=0;
for(int i=1;i<=N;i++){
if(p[i].first!=p[i-1].first) k++;
nm[p[i].second]=k;
}
for(int i=1;i<=N;i++){
pr[i]=query(nm[i]-1);
if(pr[i]==-1) d[i]=1;
else d[i]=d[pr[i]]+1;
update(nm[i],d[i],i);
}
int s=0,f=-1;
for(int i=1;i<=N;i++) if(d[i]>s) s=d[i],f=i;
out<<s<<'\n';
A[0]=0;
while(f!=-1){
A[++A[0]]=v[f];
f=pr[f];
}
for(int i=A[0];i>1;i--) out<<A[i]<<' '; out<<A[1]<<'\n';
return 0;
}