Pagini recente » Cod sursa (job #1477198) | Cod sursa (job #335709) | Cod sursa (job #8939) | Cod sursa (job #1584337) | Cod sursa (job #1162206)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int sol[100003],ind[100003],best[100003],sir[100003],n,nr,maxim,poz;
void afisare (int x){
if(ind[x]>0)
afisare(ind[x]);
fout<<sir[x]<<' ';
}
int caut (int x){
int p=0;
int u=nr;
int m=(p+u)/2;
while(p<=u){
if(sir[sol[m]]< x && x<=sir[sol[m+1]])
return m;
else if(sir[sol[m+1]]<x)
p=m+1;
else
u=m-1;
m=(p+u)/2;
}
return nr;
}
int main ()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>sir[i];
nr=1;
best[1]=sol[1]=1;
best[0]=0;
for(int i=2;i<=n;i++){
poz = caut(sir[i]);
ind[i] = sol[poz];
best[i] = poz+1;
sol[poz+1] = i;
if(nr<poz+1)
nr=poz+1;
}
for(int i=1;i<=n;i++)
if(maxim<best[i]){
maxim=best[i];
poz=i;
}
fout<<maxim<<'\n';
afisare(poz);
fout<<'\n';
return 0;
}