Cod sursa(job #2980261)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 16 februarie 2023 12:12:50
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
/// [A][M][C][B][N] ///
#include <bits/stdc++.h>
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const char sp = ' ', nl = '\n';
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int nmax = 1e5;
int v[nmax + 1]{0}, n;
int t[nmax + 1]{0};
int dp[nmax + 1]{0};
map<int, int> m;

void update(int i, int x) {
    for (; i <= nmax; i += i & (-i)) {
        t[i] = max(t[i], x);
    }
}

int get(int i) {
    int s = 0;
    for (; i > 0; i -= i & (-i)) {
        s = max(s, t[i]);
    }
    return s;
}

void read() {
    fin >> n;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
        m[v[i]] = 0;
    }
    int cnt = 0;
    for (auto it = m.begin(); it != m.end(); ++it) {
        it->second = ++cnt;
    }
    for (int i = 1; i <= n; ++i) {
        v[i] = m[v[i]];
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    read();
    int ans = 1;
    for (int i = 1; i <= n; ++i) {
        dp[i] = get(v[i] - 1) + 1;
        update(v[i], dp[i]);
        if (dp[ans] < dp[i]) {
            ans = i;
        }
    }
    fout << dp[ans] << nl;
    int cnt = dp[ans];
    stack<int> st;
    while (cnt) {
        if (dp[ans] == cnt) {
            st.push(v[ans]);
            cnt--;
        }
        ans--;
    }
    for (auto it = m.begin(); it != m.end() && st.size(); ++it) {
        if (st.top() == ++cnt) {
            fout << it->first << sp;
            st.pop();
        }
    }
}