Pagini recente » Cod sursa (job #1878644) | Cod sursa (job #288935) | Cod sursa (job #732337) | Cod sursa (job #2131566) | Cod sursa (job #2636868)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int mxN=1e5+3;
int n, poz, nr, lung;
int v[mxN], best[mxN], lg[mxN], p[mxN];
void afis(int i){
if(p[i]>0) afis(p[i]);
cout << v[i] << ' ';
}
int cautbin(int x){
int lb=0, rb=nr;
while(lb<=rb){
int mb=(lb+rb)/2;
if(v[lg[mb]]<x&&v[lg[mb+1]]>=x)
return mb;
else if(v[lg[mb+1]]<x)
lb=mb+1;
else
rb=mb-1;
}
return nr;
}
int main(){
cin >> n;
for(int i=1; i<=n; ++i)
cin >> v[i];
best[1]=lg[1]=1, lg[0]=0, nr=1;
for(int i=2; i<=n; ++i){
poz = cautbin(v[i]);
p[i]=lg[poz];
best[i]=poz+1;
lg[poz+1]=i;
if(nr<poz+1) nr=poz+1;
}
lung = poz = 0;
for(int i=1; i<=n; ++i)
if(lung<best[i])
lung=best[i], poz=i;
cout << lung << '\n';
afis(poz);
}