Pagini recente » Cod sursa (job #1652181) | Cod sursa (job #147956) | Borderou de evaluare (job #2116799) | Cod sursa (job #408825) | Cod sursa (job #1260744)
#include <iostream>
#include <cstdio>
#include <algorithm>
#define nmax 100008
using namespace std;
int n, a[nmax], maxi;
int d[nmax], q[nmax], p[nmax], sol[nmax];
void citire()
{
scanf("%d", &n);
for (int i=1; i<=n; i++)
scanf("%d ", &a[i]);
}
int cautBin(int x, int n)
{
int s=1, d=n;
while (s<=d)
{
int mid=(s+d)/2;
if (x>q[mid])
s=mid+1;
else
d=mid-1;
}
return s;
}
void solve()
{
q[++q[0]]=a[1];
p[1]=1;
for (int i=2; i<=n; i++)
{
if (a[i]>q[q[0]])
{
q[++q[0]]=a[i];
p[i]=q[0];
}
else
{
p[i]=cautBin(a[i], q[0]);
q[p[i]]=a[i];
}
}
printf("%d\n", q[0]);
}
void afisare()
{
for (int i=n; i>=1; i--)
if (q[0]==p[i])
{
sol[0]++;
sol[q[0]--]=a[i];
}
for (int i=1; i<=sol[0]; i++)
printf("%d ", sol[i]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
citire();
solve();
afisare();
return 0;
}