Pagini recente » Cod sursa (job #1585584) | Rating Dominic Satnoianu Ioan (domiiiiii) | Cod sursa (job #21546) | Cod sursa (job #1049130) | Cod sursa (job #1799390)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int N = 100010;
int n, r[N], v[N], b[N], d[N], a[N], x, up[N], i, j = 1, mx;
void update(int x, int y) {
for (; x <= n; x += x ^ (x - 1) & x)
if (d[y] > d[a[x]]) {
a[x] = y;
}
}
int querry(int x) {
mx = 0;
for (; x; x -= x ^ (x - 1) & x)
if (d[a[x]] > d[mx])
mx = a[x];
return mx;
}
int main() {
fin >> n;
for (i = 1; i <= n; ++i) {
fin >> v[i];
r[i] = b[i] = v[i];
}
sort(b + 1, b + n + 1);
for (i = 2; i <= n; ++i) {
if (b[i] != b[j]) {
b[++j] = b[i];
}
}
for (i = 1; i <= n; ++i) {
v[i] = lower_bound(b + 1, b + j + 1, v[i]) - b;
}
for (i = 1; i <= n; ++i) {
up[i] = querry(v[i] - 1);
d[i] = d[up[i]] + 1;
update(v[i], i);
}
for (i = 1; i <= n; ++i) {
if (d[x] < d[i]) {
x = i;
}
}
fout << d[x] << "\n";
for (j = 0, i = x; i; i = up[i]) {
b[++j] = r[i];
}
for (i = j; i; --i) {
fout << b[i] << ' ';
}
return 0;
}