Pagini recente » Cod sursa (job #2903149) | Cod sursa (job #2387327) | Cod sursa (job #2782075) | Cod sursa (job #699242) | Cod sursa (job #1984385)
#include <iostream>
#include<stdio.h>
using namespace std;
int v[100001], best[100001], q[100001];
int main() {
FILE *fin, *fout;
int x, n, i, maxim=1, stg, dr, mijl, steag, j;
fin = fopen("scmax.in", "r");
fout = fopen("scmax.out", "w");
fscanf(fin,"%d", &n);
for(i=1;i<=n;i++){
fscanf(fin,"%d", &v[i]);
}
q[1]=v[1];
maxim=1;
best[1]=1;
q[0]=2000000001;
for(i=2;i<=n;i++){
stg=0;
x=v[i];
dr=maxim;
mijl=(dr+stg)/2;
steag=1;
if(x>q[maxim]){
maxim++;
q[maxim]=x;
best[i]=maxim;
}
if(x==q[maxim])
steag=0;
else{
if(x==q[mijl])
steag=0;
while(dr-stg>1&&steag==1){
if(x==q[mijl])
steag=0;
if(x>q[mijl]){
stg=mijl;
}
if(x<q[mijl]){
dr=mijl;
}
mijl=(dr+stg)/2;
}
if(steag==1)
q[mijl+1]=x;
best[i]=mijl+1;
}
}
x=1;
for(i=1;i<=n;i++){
if(best[i]>maxim)
maxim=best[i];
}
for(i=1;i<=maxim;i++){
q[i]=0;
}
fprintf(fout,"%d\n", maxim);
for(i=n;i>=1;i--){
if(best[i]==maxim&&q[x-1]>v[i]){
q[x]=v[i];
x++;
maxim--;
}
}
for(i=x-1;i>=1;i--){
fprintf(fout,"%d ", q[i]);
}
fclose(fin);
fclose(fout);
return 0;
}