Cod sursa(job #3359009)

Utilizator pkseVlad Bondoc pkse Data 22 iunie 2026 21:00:15
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
using namespace std;

const int inf = 1'000'000'000;

struct aint {
    aint(int n) : n(n) {a = new int[2 * n]();}
    int n, *a;
    void update(int p, int v) {
        for(a[p += n] = v, p >>= 1; p; p >>= 1)
            a[p] = max(a[p << 1], a[p << 1 | 1]);
    }
    int query(int l, int r) {
        int ans = -inf;
        for(l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
            if(l & 1) ans = max(ans, a[l ++]);
            if(r & 1) ans = max(ans, a[-- r]);
        }
        return ans;
    }
}; 

int normalize(int *a, int n) {
    int norm[n];
    memcpy(norm, a, sizeof norm);
    sort(norm, norm + n);
    auto normend = unique(norm, norm + n);
    for(int i = 0; i < n; i ++)
        a[i] = lower_bound(norm, normend, a[i]) - norm + 1;
    return normend - norm;
}

int main() {
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    cin.tie(0)->sync_with_stdio(0);
    
    int n; cin >> n;
    int a[n] = {};
    for(int i = 0; i < n; cin >> a[i ++]);
    int og[n] = {}; memcpy(og, a, sizeof a);
    int unq = normalize(a, n);
    aint str(unq + 1);
    int dp[n] = {};
    int ans = 0;

    for(int i = 0; i < n; i ++) {
        dp[i] = 1 + str.query(0, a[i] - 1);
        ans = max(ans, dp[i]);
        str.update(a[i], dp[i]);
    }

    // int ans = str.query(0, unq - 1);
    cout << ans << '\n';
    int b[ans] = {};
    int p = 0;
    for(int i = n, j = ans, l = inf; i >= 0; i --) {
        if(dp[i] == j && a[i] < l) {
            j --;
            l = a[i];
            b[p ++] = og[i];
        }
    }

    reverse(b, b + ans);
    for(int i = 0; i < ans; i ++) {
        cout << b[i] << ' ';
    }
}