Pagini recente » Cod sursa (job #2897370) | Cod sursa (job #443019) | Cod sursa (job #2157852) | Cod sursa (job #2787780) | Cod sursa (job #1260738)
#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]=p[q[q[0]-1]]+1;
}
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;
}