Pagini recente » Monitorul de evaluare | Cod sursa (job #1998521) | Cod sursa (job #372806) | Cod sursa (job #752753) | Cod sursa (job #1781714)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
int v[100001], u[100001], ord[100001], PUTERE;
int out[100001];
inline int CB(int x, int poz){
int pas=PUTERE, rez=0;
for(pas/=2;pas>0;pas/=2)
if(rez+pas<=poz && x>u[v[rez+pas]])
rez+=pas;
return rez;
}
int main()
{
int n, i, poz, maxim=0;
fi>>n;
PUTERE=1;
while(PUTERE<n)
PUTERE*=2;
for(i=1;i<=n;i++)
fi>>u[i];
int lim=0;
for(i=1;i<=n;i++){
poz=CB(u[i],lim);
v[poz+1]=i;
if(poz+1>lim)
lim=poz+1;
ord[i]=v[poz];
if(poz+1>maxim)
maxim=poz+1;
}
fo<<maxim<<'\n';
i=v[maxim];
poz=0;
do{
out[poz++]=u[i];
i=ord[i];
}while(i!=0);
for(poz--;poz>=0;poz--)
fo<<out[poz]<<' ';
fi.close();
fo.close();
return 0;
}