Pagini recente » Cod sursa (job #2756143) | Cod sursa (job #2252050) | Cod sursa (job #2778075) | Cod sursa (job #2518506) | Cod sursa (job #1516142)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
long long int x[100050],l[100800],p[100000],sol[100005];
// p=indice predecesor element, l=indicele ultimului element de lungime i
int main()
{ long long int n,i,j,k,lnou,st,dr,med,L=0;
in>>n;
for(i=1;i<=n;i++)
in>>x[i];
L=0;
for(i=1;i<=n;i++)
{ st=1;
dr=L;
while(st<=dr)
{
med=(st+dr)/2;
if(x[l[med]]<x[i])
st=med+1;
else dr=med-1;
}
lnou=st; //lnou egal cu lmax in care ultimul element e mai mic decat x[i] ,+1 de la el. x[i];
p[i]=l[lnou-1];
l[lnou]=i;
if(lnou>L)L=lnou;
}
k=l[L];
out<<L<<'\n';
for(i=L;i>=1;i--)
{
sol[i]=k;
k=p[k];
}
for(i=1;i<=L;i++)
out<<x[sol[i]]<<" ";
return 0;
}