Pagini recente » Cod sursa (job #2938750) | Cod sursa (job #1752324) | Cod sursa (job #2543779) | Cod sursa (job #2473326) | Cod sursa (job #1644360)
#include <iostream>
#include <stdio.h>
using namespace std;
int x[100010],scmax[100010],predecesor[100010];
int n,l=1;
void citire()
{
freopen("scmax.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&x[i]);
scmax[1]=1;
}
void afis_rec(int ind)
{
if(ind)
{
afis_rec(predecesor[ind]);
printf("%d ", x[ind]);
}
}
void afisare()
{
freopen("scmax.out","w",stdout);
printf("%d\n",l);
int ind=scmax[l];
afis_rec(ind);
}
int cautare_binara(int a)
{
int st=1,dr=l;
while(st<=dr)
{
int mij=(st+dr)/2;
if(a>x[scmax[mij]])
st=mij+1;
else
dr=mij-1;
}
return st;
}
void dinamica()
{
for(int i=2;i<=n;i++)
{
int poz=cautare_binara(x[i]);
if(scmax[poz]<=x[i])
{
predecesor[i]=scmax[poz-1];
scmax[poz]=i;
if(poz>l)
l=poz;
}
}
}
int main()
{
citire();
dinamica();
afisare();
return 0;
}