Pagini recente » Cod sursa (job #1700889) | Cod sursa (job #2784503) | Cod sursa (job #1750815) | Cod sursa (job #2830665) | Cod sursa (job #2865579)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int const N=(int)1e5+5;
int n,v[N],urm[N],mx[N],dim;
int caut(int x,int st=1,int dr=dim)
{
/// mx va avea toate elementele diferite si va fi desc
/// caut cel mai din dr element care este > x
if(dr<st)
return st;
int m=(st+dr)/2;
if(v[mx[m]]<=x)
return caut(x,st,m-1);
return caut(x,m+1,dr);
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>v[i];
mx[1]=n;
dim=1; /// de la 1 la 1 momentan
for(int i=n-1;i;i--)
{
int x=caut(v[i]); /// trb pus pe x
if(x>dim)
dim++;
if(v[i]>v[mx[x]])
mx[x]=i;
urm[i]=mx[x-1];
}
fout<<dim<<'\n';
for(int x=mx[dim];x;fout<<v[x]<<' ',x=urm[x]);
}