Pagini recente » Cod sursa (job #2972816) | Cod sursa (job #1278015) | Cod sursa (job #2955200) | Cod sursa (job #483735) | Cod sursa (job #1347645)
#include <cstdio>
#include <algorithm>
#define f first
#define s second
#define sol(x) (x&(-x))
using namespace std;
int v[100010], b[100010], aib[100010], c[100010], n;
pair <int, int> a[100010];
inline int query (int x)
{
int rez = 0;
for (; x; x -= sol(x))
rez = max (aib[x], rez);
return rez + 1;
}
inline void add (int x)
{
int y = x + sol(x);
for (; y <= n; y += sol(y))
aib[y] = max (aib[y], aib[x]);
}
int main ()
{
freopen ("scmax.in", "r", stdin);
freopen ("scmax.out", "w", stdout);
scanf ("%d\n", &n);
for (int i = 1; i <= n; ++i)
{
scanf ("%d", &v[i]);
a[i].f = v[i];
a[i].s = i;
}
sort (a + 1, a + n + 1);
int x = 0;
for (int i = 1; i <= n; ++i)
{
if (a[i].f != a[i - 1].f) ++x;
b[x] = v[a[i].s];
v[a[i].s] = x;
}
int ma = 0, p1;
for (int i = 1; i <= n; ++i)
{
aib[v[i]] = query (v[i] - 1);
if (aib[v[i]] > ma) ma = aib[v[i]], p1 = v[i];
add (v[i]);
}
int k = 0;
for (int i = p1; i && ma; --i)
if (ma == aib[i]) c[++k] = i, --ma;
printf ("%d\n", k);
for (int i = k; i; --i)
printf ("%d ", b[c[i]]);
printf ("\n");
return 0;
}