Pagini recente » Cod sursa (job #2605714) | Cod sursa (job #613421) | Cod sursa (job #933869) | Cod sursa (job #2972656) | Cod sursa (job #1984612)
#include <iostream>
#include <stdio.h>
using namespace std;
int v[100001],sol[100001],poz[100001],f[100001];
int main(){
FILE *fin,*fout;
fin=fopen("scmax.in","r");
fout=fopen("scmax.out","w");
int n,i,nr,m,l1,l2,pozz,x;
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++)
fscanf(fin,"%d",&v[i]);
nr=1;
sol[1]=v[1];
poz[1]=1;
for(i=2;i<=n;i++){
if(v[i]>sol[nr]){
nr++;
sol[nr]=v[i];
poz[i]=nr;
}
else{
l1=1;
l2=nr;
pozz=1;
while(l1<=l2){
m=(l1+l2)/2;
if(sol[m]<v[i])
l1=m+1;
else{
l2=m-1;
pozz=m;
}
}
sol[pozz]=v[i];
poz[i]=pozz;
}
}
fprintf(fout,"%d\n",nr);
x=nr;
for(i=n;i>=1;i--)
if(f[poz[i]]==0){
sol[x]=v[i];
x--;
f[poz[i]]=1;
}
for(i=1;i<=nr;i++)
fprintf(fout,"%d ",sol[i]);
fclose(fin);
fclose(fout);
return 0;
}