Pagini recente » Cod sursa (job #1495724) | Cod sursa (job #3177942) | Cod sursa (job #1348572) | Cod sursa (job #1835173) | Cod sursa (job #2400651)
#include <iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int v[N];
int len[N];
int fost[N];
int cur;
int cb(int val){
int pas=0,p2=1<<16;
while(p2){
if(pas+p2<cur && v[len[pas+p2]]<=val)
pas+=p2;
p2/=2;
}
return pas;
}
FILE*fin,*fout;
void afis(int poz){
if(fost[poz]>0){
afis(fost[poz]);
}
fprintf(fout,"%d ",v[poz]);
}
int main()
{
fin=fopen("scmax.in","r");
fout=fopen("scmax.out","w");
int n;
fscanf(fin,"%d",&n);
for(int i=1;i<=n;i++){
fscanf(fin,"%d",&v[i]);
}
len[0]=1;
for(int i=2;i<=n;i++){
if(v[i]>v[len[cur]]){
fost[i]=len[cur];
cur++;
len[cur]=i;
}
else{
int poz=cb(v[i]);
fost[i]=len[poz-1];
len[poz]=i;
}
}
fprintf(fout,"%d\n",cur+1);
afis(len[cur]);
return 0;
}