Pagini recente » Monitorul de evaluare | Cod sursa (job #538734)
Cod sursa(job #538734)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define maxn 100005
int i,N,pmax,nr,imax,Max;
int v[maxn],L[maxn],from[maxn],Smax[maxn];
void citire()
{
fin >> N;
for(i=1;i<=N;i++)
fin >> v[i];
}
int cb(int x)
{
int st, dr,m;
st=0; dr= nr; m=(st+dr)/2;
while(st<=dr)
{
if(v[L[m]]<x && v[L[m+1]]>=x) return m;
else if(v[L[m+1]]<x) st=m+1;
else dr=m-1;
m=(st+dr)/2;
}
return nr;
}
void pd()
{
L[0]=0; Smax[1]=L[1]=1; nr=1;
for(i=2;i<=N;i++)
{
pmax=cb(v[i]);
L[pmax+1]=i;
Smax[i]=pmax+1;
from[i]=L[pmax];
if(nr<pmax+1) nr=pmax+1;
}
for(i=1;i<=N;i++)
if(Smax[i]>Max)
{
Max=Smax[i];
imax=i;
}
}
void afisare(int k)
{
if(from[k]>0) afisare(from[k]);
fout << v[k] << ' ';
}
int main()
{
citire();
pd();
fout << Max << '\n';
afisare(imax);
}