Pagini recente » Cod sursa (job #440696) | Cod sursa (job #2163055) | Cod sursa (job #2545022) | Cod sursa (job #986995) | Cod sursa (job #2449492)
#include <cstdio>
#include <iostream>
#include <map>
#include <set>
using namespace std;
const int N = 100001;
set <int> s;
map <int, int> d;
int n, a[N], b[N];
int dp[N];
pair <int, int> t[N];
void upd(int p, int x, int i) {
while (p <= n) {
t[p] = max(t[p], {x, i});
p += p & (-p);
}
}
pair <int, int> get(int p) {
pair <int, int> it = {0, 0};
while (p) {
it = max(it, t[p]);
p -= p & (-p);
}
return it;
}
int par[N];
int ans[N];
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", &a[i]);
s.insert(a[i]);
}
int now = 0;
for (auto &x : s)
d[x] = ++now;
for (int i = 1; i <= n; i++) {
b[i] = d[a[i]];
pair <int, int> it = get(b[i] - 1);
dp[i] = it.first + 1;
par[i] = it.second;
upd(b[i], dp[i], i);
}
int sol = get(n).first;
for (int i = 1; i <= n; i++)
if (dp[i] == sol)
now = i;
int cur = sol;
ans[cur] = now;
while (cur - 1 >= 1) {
cur--;
now = par[now];
ans[cur] = now;
}
printf("%d\n", sol);
for (int i = 1; i <= sol; i++)
printf("%d ", a[ans[i]]);
printf("\n");
return 0;
}