Cod sursa(job #3322841)

Utilizator magnifica5Tabarca Ioana magnifica5 Data 15 noiembrie 2025 22:17:23
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int main() {

    int n;
    cin >> n;
    vector<long long> a(n + 1);
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
    }
    vector<long long> tails(n + 1);
    vector<int> pos(n + 1);
    vector<int> parent(n + 1, 0);
    int lmax = 0;
    for(int i = 1; i <= n; i++) {
        int st = 1, dr = lmax, rasp = 0;
        while(st <= dr) {
            int mid = (st + dr) / 2;
            if(tails[mid] < a[i]) {
                rasp = mid;
                st = mid + 1;
            } else {
                dr = mid - 1;
            }
        }
        int len = rasp + 1;
        tails[len] = a[i];
        pos[len] = i;
        parent[i] = (rasp > 0 ? pos[rasp] : 0);
        if(len > lmax) {
          lmax = len;
        }
    }
    vector<long long> sol;
    int p = pos[lmax];
    while(p != 0) {
        sol.push_back(a[p]);
        p = parent[p];
    }
    reverse(sol.begin(), sol.end());
    cout << lmax << "\n";
    for(long long x : sol){
       cout << x << " ";
    }
}