Cod sursa(job #3262340)

Utilizator SilviuC25Silviu Chisalita SilviuC25 Data 9 decembrie 2024 19:33:18
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX_NUM = 1e5 + 5;
vector<pair<int, int>> tree(4 * MAX_NUM, {0, 0});
vector<int> last(MAX_NUM, -1);

bool sortCrt(pair<int, int> a, pair<int, int> b) {
    if (a.first == b.first) {
        return a.second > b.second;
    }
    return a.first < b.first;
}

pair<int, int> maxInInterval(int node, int l, int r, int queryL, int queryR) {
    if (queryL <= l && r <= queryR) {
        return tree[node];
    }
    if (queryL > r || queryR < l) {
        return {0, 0};
    }
    int mid = (l + r) / 2;
    return max(maxInInterval(2 * node + 1, l, mid, queryL, queryR), maxInInterval(2 * node + 2, mid + 1, r, queryL, queryR));
}

void update(int node, int l, int r, int pos, pair<int, int> value) {
    if (l == r) {
        tree[node] = max(tree[node], value);
        return;
    }
    int mid = (l + r) / 2;
    if (pos <= mid) {
        update(2 * node + 1, l, mid, pos, value);
    } else {
        update(2 * node + 2, mid + 1, r, pos, value);
    }
    tree[node] = max(tree[2 * node + 1], tree[2 * node + 2]);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int n;
    cin >> n;
    vector<int> a(n);
    vector<pair<int, int>> sorted(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
        sorted[i] = {a[i], i};
    }
    sort(sorted.begin(), sorted.end(), sortCrt);
    int target = -1, maxSeq = 0;
    for (auto [value, index] : sorted) {
        auto [len, lastIndex] = maxInInterval(0, 1, n, 1, index - 1);
        update(0, 1, n, index, {len + 1, index});
        last[index] = lastIndex;
        if (len + 1 > maxSeq) {
            maxSeq = len + 1;
            target = index;
        }
    }
    stack<int> sequence;
    for (int current = target; current != 0; current = last[current]) {
        sequence.push(a[current]);
    }
    cout << maxSeq << "\n";
    while (!sequence.empty()) {
        cout << sequence.top() << " ";
        sequence.pop();
    }
    return 0;
}