Cod sursa(job #3339413)

Utilizator mihai_bosIancu Mihai mihai_bos Data 7 februarie 2026 21:25:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, v[100001], i, j, dp[100001], maxim;
int aib[100001], pos_aib[100001], tata[100001];
pair<int, int> temp[100001];
int norm_v[100001];
vector<int> drum;

void update(int idx, int val, int poz_originala) {
    for (; idx <= n; idx += idx & -idx) {
        if (val > aib[idx]) {
            aib[idx] = val;
            pos_aib[idx] = poz_originala;
        }
    }
}

pair<int, int> query(int idx) {
    int res = 0, ultima_poz = 0;
    for (; idx > 0; idx -= idx & -idx) {
        if (aib[idx] > res) {
            res = aib[idx];
            ultima_poz = pos_aib[idx];
        }
    }
    return {res, ultima_poz};
}

int main() {
    in >> n;
    for (i = 1; i <= n; ++i) {
        in >> v[i];
        temp[i] = {v[i], i};
    }

    sort(temp + 1, temp + n + 1);
    int rang = 1;
    for (i = 1; i <= n; ++i) {
        if (i > 1 && temp[i].first > temp[i - 1].first) rang++;
        norm_v[temp[i].second] = rang;
    }

    int poz_finala = 0;
    for (i = 1; i <= n; ++i) {
        pair<int, int> cel_mai_bun = query(norm_v[i] - 1);

        dp[i] = cel_mai_bun.first + 1;
        tata[i] = cel_mai_bun.second;

        update(norm_v[i], dp[i], i);

        if (dp[i] > maxim) {
            maxim = dp[i];
            poz_finala = i;
        }
    }

    out << maxim << '\n';

    int curr = poz_finala;
    while (curr > 0) {
        drum.push_back(v[curr]);
        curr = tata[curr];
    }

    reverse(drum.begin(), drum.end());
    for (auto x : drum) out << x << ' ';

    return 0;
}