Pagini recente » Borderou de evaluare (job #1021122) | Cod sursa (job #387083) | Cod sursa (job #3350651) | Monitorul de evaluare | Cod sursa (job #3337446)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#define MAXN 100000
int v[MAXN],prevpos[MAXN],lastind[MAXN];
int binSearch(int val,int st,int dr){
while(dr-st>1){
int mij=(st+dr)/2;
if(v[lastind[mij]]<val){
st=mij;
}else{
dr=mij;
}
}
return dr;
}
void writeSol(int pos){
if(pos!=-1){
writeSol(prevpos[pos]);
cout<<v[pos]<<" ";
}
}
int main(){
int n,i,maxl;
cin>>n;
for(i=0;i<n;i++){
cin>>v[i];
}
maxl=0;
for(i=0;i<n;i++){
int len=binSearch(v[i],-1,maxl);
lastind[len]=i;
prevpos[i]=-1;
if(len>0){
prevpos[i]=lastind[len-1];
}
if(len==maxl){
maxl++;
}
}
cout<<maxl<<"\n";
writeSol(lastind[maxl-1]);
return 0;
}