Pagini recente » Cod sursa (job #2038213) | Cod sursa (job #1945253) | Cod sursa (job #2941907) | Cod sursa (job #2882416) | Cod sursa (job #1466765)
#include <cstdio>
#include <algorithm>
#define Dim 100003
using namespace std;
int n, v[Dim], i, j, poz, nr, best[Dim], maxx, sol[Dim], L[Dim];
void write(int i)
{
if(sol[i] > 0)
write(sol[i]);
printf("%d ", v[i]);
}
void read()
{
scanf("%d", &n);
for(i = 1; i <= n; ++ i)
scanf("%d", &v[i]);
}
int bsearch(int x)
{
int st = 0, dr = nr, m = (st + dr) / 2;
while(st <= dr)
{
if(v[L[m]] < x && v[L[m + 1]] >= x)
return m;
else if(v[L[m]] < x)
st = m + 1, m = (st + dr) / 2;
else
dr = m - 1, m = (st + dr) / 2;
}
return nr;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
read();
best[1] = L[1] = 1;
L[0] = 0;
nr = 1;
for(i = 2; i <= n; ++ i)
{
poz = bsearch(v[i]);
best[i] = poz + 1;
L[poz + 1] = i;
sol[i] = L[poz];
if(nr < poz + 1)
nr = poz + 1;
}
maxx = 0;
poz = 0;
for(i = 1; i <= n; ++ i)
{
if(maxx < best[i])
{
maxx = best[i];
poz = i;
}
}
printf("%d\n", maxx);
write(poz);
return 0;
}