Cod sursa(job #3349224)

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

int tail[100005];
int pos[100005];
int parent[100005];

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);
    
    for (int i = 0; i < N + 5; i++) 
        parent[i] = -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, tail + len, a[i]) - tail;

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

        if (p > 0)
            parent[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 = parent[cur];
    }

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

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

    return 0;
}