Cod sursa(job #2267029)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 23 octombrie 2018 10:11:52
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <vector>
#include <fstream>

#define VMAX 100010

std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");

int n;
int lg, v[VMAX];

int a[VMAX];
int pos[VMAX];

int find(int val) {
    if (v[lg] < val) {
        v[++lg] = val;
        return lg;
    }

    int m, lo = 0, hi = lg + 1;
    while (hi - lo > 1) {
        m = (lo + hi) >> 1;
        if (val > v[m])
            lo = m;
        else
            hi = m;
    }
    return hi;
}

void solve(int srcPos, int val) {
    int i;
    for (i = srcPos; i >= 1; i--)
        if (pos[i] == val) {
            solve(i - 1, val - 1);
            fout << a[i] << ' ';
            break;
        }
}

int main() {
    int i, j;

    fin >> n;
    for (i = 1; i <= n; i++)
        fin >> a[i];

    pos[1] = 1;
    v[++lg] = a[1];

    for (i = 2; i <= n; i++) {
        j = find(a[i]);
        v[j] = a[i];
        pos[i] = j;
    }

    fout << lg << '\n';
    solve(n, lg);
    fout << '\n';

    fout.close();
    return 0;
}