Pagini recente » Cod sursa (job #473104) | Cod sursa (job #1831053) | Cod sursa (job #1616768) | Cod sursa (job #169809) | Cod sursa (job #2289222)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scamx.out");
int n,a[100005];
int el[100005];
int poz[100005];
void citire()
{
fin>>n;
for(int i=1; i<=n; i++)
fin>>a[i];
}
int bsc1(int st, int dr, int i)
{
if(st==dr)
return st;
int m=(dr+st)/2;
if(el[m]<i) return bsc1(m+1,dr,i);
return bsc1(st,m,i);
}
void rezolva()
{
int p,k=1;
el[1]=a[1];
poz[1]=1;
int lgmax1=1;
for(int i=2; i<=n; i++)
{
p=0;
if(a[i]>el[k])
{
k++;
el[k]=a[i];
p=k;
}
else
{
p=bsc1(1,k,a[i]);
el[p]=a[i];
if(p>k)
k=p;
}
poz[i]=p;
if(lgmax1<p)
lgmax1=p;
}
fout<<lgmax1<<"\n";
k=1;
for(int i=n; i>=1; i--)
if(poz[i]==lgmax1)
{
el[k++]=a[i];
lgmax1--;
}
for(int i=k-1; i>=1; i--)
fout<<el[i]<<" ";
}
int main()
{
citire();
rezolva();
return 0;
}