Cod sursa(job #3349222)

Utilizator tudorbuhniaTudor Buhnia tudorbuhnia Data 26 martie 2026 15:40:33
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;

int main() 
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    
    // ios::sync_with_stdio(false);
    // cin.tie(nullptr);

    int N;
    fin >> N;

    vector<long long> a(N);
    for (int i = 0; i < N; i++) 
        fin >> a[i];

    vector<long long> tail(N);
    vector<int> pos(N);
    vector<int> prev(N, -1);

    int len = 0; // lungimea LIS

    for (int i = 0; i < N; i++) {
        // cautam prima pozitie unde tail[p] >= a[i]
        int p = lower_bound(tail.begin(), tail.begin() + len, a[i]) - tail.begin();

        tail[p] = a[i];
        pos[p] = i;

        if (p > 0)
            prev[i] = pos[p - 1];

        if (p == len)
            len++;
    }

    // reconstructie
    vector<long long> lis;
    int cur = pos[len - 1];

    while (cur != -1) {
        lis.push_back(a[cur]);
        cur = prev[cur];
    }

    reverse(lis.begin(), lis.end());

    // output
    fout << len << "\n";
    for (auto x : lis)
        fout << x << " ";
        
    // cout << "\n";

    return 0;
}