Cod sursa(job #2018149)

Utilizator loginLogin Iustin Anca login Data 3 septembrie 2017 17:32:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
# include <iostream>
# include <fstream>
# include <cmath>

# define DIM 100003
# define MAX 2147483647

using namespace std;

int n, v[DIM], a[4 * DIM], b[DIM], bs, ps, l[DIM];

void update(int k, int st, int dr, int p, int w) {
    if (st == dr) {
        if (v[a[k]] > v[w] || a[k] == 0) {
            a[k] = w;
        }
        return;
    }

    int mid = (st + dr) / 2;

    if (p <= mid) {
        update(2 * k, st, mid, p, w);
    } else {
        update(2 * k + 1, mid + 1, dr, p, w);
    }

    if (v[a[2 * k]] < v[a[2 * k + 1]]) {
        a[k] = a[2 * k];
    } else {
        a[k] = a[2 * k + 1];
    }
}

int query(int k, int st, int dr, int w) {
    if (st == dr) {
        if (v[a[k]] < w) {
            return a[k];
        }

        return 0;
    }

    int mid = (st + dr) / 2;

    if (v[a[2 * k + 1]] < w) {
        return query(2 * k + 1, mid + 1, dr, w);
    }

    return query(2 * k, st, mid, w);
}

void read() {
    ifstream fin ("scmax.in");

    fin>>n;

    for (int i = 1; i <= n; ++i) {
        fin>>v[i];
    }
}

void scmax() {
    v[0] = MAX;
    for (int i = 1; i <= n; ++i) {
        int p = query(1, 1, n, v[i]);
        l[i] = l[p] + 1;
        b[i] = p;
        if (bs < l[i]) {
            bs = l[i];
            ps = i;
        }
        update(1, 1, n, l[i], i);
    }
}

void print() {
    ofstream fout ("scmax.out");
    fout<<bs<<"\n";

    l[0] = 0;
    while (ps) {
        l[++l[0]] = v[ps];
        ps = b[ps];
    }

    for (int i = l[0]; i; --i) {
        fout<<l[i]<<" ";
    }
}

int main() {
    read();
    scmax();
    print();

    return 0;
}