Pagini recente » Cod sursa (job #1915159) | Monitorul de evaluare | Cod sursa (job #3321416) | Cod sursa (job #3337557) | Cod sursa (job #1904748)
#include <iostream>
#include <cstdio>
using namespace std;
const int NMax = 100005;
const int inf = 0x3f3f3f3f;
int N, a[NMax], b[NMax], poz[NMax];
int drr;
void Read()
{
scanf("%d", &N);
for(int i=1; i<=N; ++i)
scanf("%d", &a[i]);
}
int BinSea(int st, int dr, int x)
{
int m;
while(st<=dr)
{
m=st+(dr-st)/2;
if(x<a[b[m]])
st = m+1;
else
dr = m-1;
}
return st;
}
void SCMAX()
{
a[0]=inf;
for(int i=N; i>=1; --i)
{
poz[i]=0;
int k=BinSea(1,drr,a[i]);
if(k>drr)
{
poz[i]=b[k-1];
drr=k;
b[k]=i;
}
else
{
poz[i]=b[k-1];
if(a[b[k]] < a[i])
{
b[k]=i;
}
}
}
}
void Print()
{
cout<<drr<<"\n";
for(int i=b[drr]; i>0; i=poz[i])
cout<<a[i]<<" ";
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
Read();
SCMAX();
Print();
return 0;
}