Cod sursa(job #3331313)

Utilizator coco11coraline kalbfleisch coco11 Data 26 decembrie 2025 16:09:02
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;

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<long long> a(N + 1);
    for (int i = 1; i <= N; ++i) {
        cin >> a[i];
    }

    vector<int> tail(N + 1, 0);
    vector<int> par(N + 1, -1);
    vector<int> poz(N + 1, 0);

    int Lmax = 0;
    int lastPos = 0;

    for (int i = 1; i <= N; ++i) {
        int st = 1, dr = Lmax, ans = 0;

        while (st <= dr) {
            int mid = (st + dr) / 2;
            if (a[tail[mid]] < a[i]) {
                ans = mid;
                st = mid + 1;
            } else {
                dr = mid - 1;
            }
        }

        int len = ans + 1;
        poz[i] = len;
        par[i] = (ans == 0 ? -1 : tail[ans]);
        tail[len] = i;

        if (len > Lmax) {
            Lmax = len;
            lastPos = i;
        }
    }

    vector<long long> lis;
    int cur = lastPos;
    while (cur != -1) {
        lis.push_back(a[cur]);
        cur = par[cur];
    }
    reverse(lis.begin(), lis.end());

    cout << Lmax << "\n";
    for (int i = 0; i < (int)lis.size(); ++i) {
        cout << lis[i] << (i + 1 == (int)lis.size() ? '\n' : ' ');
    }

    return 0;
}