Cod sursa(job #2891002)

Utilizator Apyxabcdefghij Apyx Data 17 aprilie 2022 12:41:40
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[100005], a[100005], prv[100005], n, lung[100005], mx = INT_MIN, poz;
pair<int,int> aib[100005];

int bs(int val) {
    int st = 1;
    int dr = n;
    int poz = 0;
    while(st <= dr) {
        int mid = (st + dr) / 2;
        if(a[mid] == val) {
            return mid;
        } else {
            if(a[mid] > val) {
                dr = mid - 1;
            } else {
                st = mid + 1;
            }
        }
    }
}

void update(int poz, int val, int ind) {
    while(poz <= n) {
        aib[poz] = max(aib[poz], {val, ind});
        poz += (poz&(-poz));
    }
}

pair<int,int> query(int poz) {
    pair<int,int> rez = {0, 0};
    while(poz >= 1) {
        rez = max(rez, aib[poz]);
        poz -= (poz&(-poz));
    }
    return rez;
}

void afis(int poz) {
    if(poz == 0) {
        return;
    }
    afis(prv[poz]);
    fout << a[v[poz]] << " ";
}

int main() {
    fin >> n;
    for(int i = 1; i <= n; i++) {
        fin >> v[i];
        a[i] = v[i];
    }
    sort(a+1, a+n+1);
    for(int i = 1; i <= n; i++) {
        v[i] = bs(v[i]);
    }
    for(int i = 1; i <= n; i++) {
        pair<int,int> val = query(v[i]-1);
        lung[i] = 1 + val.first;
        prv[i] = val.second;
        update(v[i], lung[i], i);
        if(mx < lung[i]) {
            mx = lung[i];
            poz = i;
        }
    }
    fout << mx << "\n";
    afis(poz);
    return 0;
}