Cod sursa(job #2180752)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 21 martie 2018 09:21:23
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <vector>
#include <fstream>

#define VMAX 100010

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

int n;
std::vector<int> v(1);

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

int find(int val) {
    if (v[v.size() - 1] < val) {
        v.push_back(0);
        return v.size() - 1;
    }

    int m, lo = 0, hi = v.size();
    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) {
    for (int i = srcPos; i >= 1; i--)
        if (pos[i] == val) {
            solve(i - 1, val - 1);
            fout << v[pos[i]] << ' ';
            break;
        }
}

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

    pos[1] = 1;
    v.push_back(a[1]);

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

    fout << v.size() - 1 << '\n';
    solve(n, v.size() - 1);
    fout << '\n';

    fout.close();
    return 0;
}