Pagini recente » Cod sursa (job #1014952) | Cod sursa (job #2379638) | Cod sursa (job #208635) | Cod sursa (job #1100899) | Cod sursa (job #2497604)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in"); ofstream fout("scmax.out");
int n, c[1000010], a[1000010], dp[1000010], sz, k, p[100010];
void print_seq(int m){
int c=m; int temp=1000000000;
string res;
for(int i=n-1; i>=0; --i){
if(dp[i]==c && a[i]<temp){c--; res=to_string(a[i])+' '+res; temp=a[i];}
}
cout<<res;
}
int binary_search(int l, int r, int e){
int m=(l+r)/2;
if(e>c[m]){return binary_search(m+1, r, e);}
else{
if(e<=c[m] && e>c[m-1]){return m;}
else{return binary_search(l, m-1, e);}
}
}
int main(){
cin>>n;
cin>>a[0];
c[1]=a[0];
dp[0]=1;
sz=1;
for(int i=1; i<n; i++){
cin>>a[i];
if(a[i]>c[sz]){
c[sz+1]=a[i];
dp[i]=sz+1;
sz++;
}
else{
if(a[i]<c[1]){
c[1]=a[i];
dp[i]=1;
}
else{
k=binary_search(1, sz, a[i]);
c[k]=a[i];
dp[i]=k;
}
}
}
int m=0;
for(int i=0; i<n; i++){if(dp[i]>m){m=dp[i];}}
cout<<m<<endl;
print_seq(m);
return 0;
}