Pagini recente » Cod sursa (job #3249374) | Cod sursa (job #250112) | Borderou de evaluare (job #2550147) | Cod sursa (job #2766059) | Cod sursa (job #2501058)
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int findPos(int *lcs,int *v,int l,int r,int x)
{
if(l>r)
return l;
int m=(l+r)/2;
if(v[lcs[m]]<x)
return findPos(lcs,v,m+1,r,x);
return findPos(lcs,v,l,m-1,x);
}
int main()
{
int n,v[NMAX],lcs[NMAX],m=0,p[NMAX];;
f>>n;
for(int i=0;i<n;++i)
{
f>>v[i];
p[i]=-1;
}
lcs[m++]=0;
for(int i=1;i<n;++i)
{
int k=findPos(lcs,v,0,m-1,v[i]);
if(k>0)
p[i]=lcs[k-1];
lcs[k]=i;
if(k+1>m)
m=k+1;
}
g<<m<<'\n';
int res[NMAX],k=m;
for(int i=lcs[m-1];i>=0;i=p[i])
res[--m]=v[i];
for(int i=0;i<k;++i)
g<<res[i]<<' ';
return 0;
}