Pagini recente » Cod sursa (job #1236186) | Cod sursa (job #576580) | Cod sursa (job #2282582) | Cod sursa (job #763343) | Cod sursa (job #1349729)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,lmax;
int v[100001];
int m[100001];
int t[100001];
void citire()
{
in>>n;
for(int i=1; i<=n; i++)
in>>v[i];
}
void af_rec(int x)
{
if(t[x])
af_rec(t[x]);
out<<v[x]<<' ';
}
void rezolvare()
{
int i;
int b,e,mid;
t[1]=0;
m[1]=1;
lmax=1;
v[0]=2000000010;
for(i=2;i<=n;i++)
{
b=1;
e=lmax;
while(b!=e)
{
mid=(b+e)/2;
if(v[i]>=v[m[mid]])
b=mid+1;
else
e=mid-1;
}
if(v[m[b]]>=v[i])
b--;
if(b==lmax)
lmax++;
if(v[m[b+1]]>v[i])
m[b+1]=i;
t[i]=m[b];
}
out<<lmax<<'\n';
af_rec(m[lmax]);
}
int main()
{
citire();
rezolvare();
return 0;
}