Pagini recente » Cod sursa (job #2437668) | Cod sursa (job #2424619) | Cod sursa (job #606851) | Cod sursa (job #2898295) | Cod sursa (job #2047018)
#include <iostream>
#include <cstdio>
using namespace std;
int n, a[100001], tata[100001], sub[100001], lmax=1;
void Citire()
{
scanf("%d\n", &n);
for(int i=1; i<=n; i++)
scanf("%d ", &a[i]);
}
int Cautare(int x, int nr)
{
int st=1, dr=nr;
int mij=(st+dr)/2;
while(mij<dr)
{
if(a[sub[mij]]<x && a[sub[mij+1]]>=x)
return mij+1;
else if(a[sub[mij]]>x)
{
dr=mij-1;
mij=(st+dr)/2;
}
else{
st=mij+1;
mij=(dr+st)/2;
}
}
}
void Afisare(int i)
{
if(tata[i]>0) Afisare(tata[i]);
cout<<a[i]<<" ";
}
void CreareSub()
{
for(int i=2; i<=n; i++)
{
if(a[i]>a[sub[lmax]])
{
sub[++lmax]=i;
tata[i]=sub[lmax-1];
}
else if(a[i]<a[sub[1]])
sub[1]=i;
else {
int m=Cautare(a[i], lmax-1);
sub[m]=i;
tata[i]=sub[m-1];
}
}
cout<<lmax<<endl;
Afisare(sub[lmax]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
Citire();
sub[1]=1;
CreareSub();
return 0;
}