Cod sursa(job #1799390)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 6 noiembrie 2016 11:51:23
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#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;
}