Cod sursa(job #2575618)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 6 martie 2020 14:40:42
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <map>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 100005;
int v[NMAX];
map <int, int> mp;
map <int, int> gmp;
int aint[4 * NMAX];
int sol[NMAX];
void update(int nod, int st, int dr, int poz, int val) {
    if(st == dr) {
        aint[nod] = val;
        return ;
    }
    int mij = (st + dr) / 2;
    if(poz <= mij) {
        update(2 * nod, st, mij, poz, val);
    }
    else {
        update(2 * nod + 1, mij + 1, dr, poz, val);
    }
    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int query(int nod, int st, int dr, int x, int y) {
    if(st > dr) {
        return 0;
    }
    if(dr < x) {
        return 0;
    }
    if(y < st) {
        return 0;
    }
    if(x <= st && dr <= y) {
        return aint[nod];
    }
    int mij = (st + dr) / 2;
    int sol1 = query(2 * nod, st, mij, x, y);
    int sol2 = query(2 * nod + 1, mij + 1, dr, x, y);
    return max(sol1, sol2);
}
vector <int> solt;

int main() {
    int n;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &v[i]);
        mp[v[i]] = 0;
    }
    int cnt = 0;
    map<int, int>::iterator it;
    for(it = mp.begin(); it != mp.end(); it++) {
        mp[(*it).first] = ++cnt;
    }
    int maxim = 0;
    for(int i = 1; i <= n; i++) {
        int nr = mp[v[i]];
        int ss = query(1, 1, n, 1, nr - 1);
        update(1, 1, n, nr, ss + 1);
        sol[i] = ss + 1;
        maxim = max(maxim, sol[i]);
    }
    printf("%d\n", maxim);
    for(int i = n; i > 0; i--) {
        if(sol[i] == maxim) {
            maxim--;
            solt.push_back(v[i]);
        }
    }
    for(int i = solt.size() - 1; i >= 0; i--) {
        printf("%d ", solt[i]);
    }
    printf("\n");
    return 0;
}