Pagini recente » Cod sursa (job #499425) | Cod sursa (job #626261) | Cod sursa (job #1785546) | Cod sursa (job #3159489) | Cod sursa (job #1606613)
#include <iostream>
#include <cstdio>
#define MAXN 100050
int din[MAXN], a[MAXN], sz, n; /// a[din[i]] = cel mai mic nr la care se termina un subsir de lungime i
int prev[MAXN]; /// reconstituire
int sol[MAXN], nq;
int getInd(int nr)
{
/// cel mai mare indice cu din[i] < nr
int step, rez;
for (step = 1; step << 1 <= sz; step <<= 1);
for (rez = 0; step; step >>= 1)
if (rez+step <= sz && a[din[rez+step]] < nr)
rez += step;
return rez;
}
void solve()
{
din[1] = 1; sz = 1;
a[0] = 0x7fffffff;
for (int i = 2; i <= n+1; i++) din[i] = 0;
for (int i = 2; i <= n; i++) {
int ind = getInd(a[i]);
if (a[i] < a[din[ind+1]]) {
prev[i] = din[ind];
din[ind+1] = i;
}
sz = std::max(sz, ind+1);
}
}
void afisare()
{
printf("%d\n", sz);
for (int i = 1, k = din[sz]; i <= sz; i++, k = prev[k])
sol[++nq] = a[k];
for (int i = nq; i; --i)
printf("%d ", sol[i]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d ", &n);
for (int i = 1; i <= n; i++)
scanf("%d ", &a[i]);
solve();
afisare();
return 0;
}