Cod sursa(job #2409684)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 19 aprilie 2019 12:40:40
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
int n,v[100005],pozitie[100005],lun[100005],ant[100005],sl,sol[100005];
struct str {
    int val,poz;
}aib[100005];
pair<int,int> s[100005];
void update_aib (int poz, int elm, int val) {
    for (int i = poz; i <= n; i += i&(-i)) {
        if (val > aib[i].val) {
            aib[i].val = val;
            aib[i].poz = elm;
        }
    }
}

pair<int,int> query_aib (int poz) {
    int maxim = 0;
    int elm = 0;
    for (int i = poz; i >= 1; i -= i&(-i)) {
        if (maxim < aib[i].val) {
            maxim = aib[i].val;
            elm = aib[i].poz;
        }
    }
    return {maxim,elm};
}

int main (void) {
    in >> n;
    for (int i = 1; i <= n; i ++) {
        in >> v[i];
        s[i].first = v[i];
        s[i].second = i;
    }
    sort (s+1,s+n+1);
    for (int i = 1; i <= n; i ++) {
        int x = i;
        while (s[x].first == s[x-1].first) {
            x --;
        }
        pozitie[s[i].second] = x-1;
    }
    for (int i = 1; i <= n; i ++) {
        if (pozitie[i] != 0) {
            pair<int,int> aux = query_aib (pozitie[i]);
            lun[i] = aux.first + 1;
            ant[i] = aux.second;
        }
        else {
            lun[i] = 1;
            ant[i] = 0;
        }
        update_aib (pozitie[i]+1,i,lun[i]);
    }
    int maxim = 0;
    int ultim = 0;
    for (int i = 1; i <= n; i ++) {
        if (maxim < lun[i]) {
            maxim = lun[i];
            ultim = i;
        }
    }

    while (true) {
        sol[++sl] = v[ultim];
        ultim = ant[ultim];
        if (ultim == 0) break;
    }
    out << sl <<"\n";
    for (int i = sl; i >= 1; i --) {
        out << sol[i] <<" ";
    }
    return 0;
}