Cod sursa(job #3302509)

Utilizator AndreiEsteNebunAndrei Mateescu AndreiEsteNebun Data 8 iulie 2025 13:21:36
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

string filename = "scmax";

ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

const int NMAX = 1e5;
const int INF = 1e9;

int v[NMAX + 5];
int previous[NMAX + 5];
int dp[NMAX + 5];

int main() {
    int n;
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> v[i];

    v[0] = -INF;
    dp[0] = 0;

    int bestLength = 0;

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

        while (st <= dr) {
            int mij = (st + dr) / 2;
            if (v[i] > v[dp[mij]]) {
                ans = mij;
                st = mij + 1;
            } else {
                dr = mij - 1;
            }
        }

        ans++;
        dp[ans] = i;
        previous[i] = dp[ans - 1];
        bestLength = max(bestLength, ans);
    }

    fout << bestLength << '\n';

    vector<int> ans;
    int currentPos = dp[bestLength];
    while (currentPos != 0) {
        ans.push_back(v[currentPos]);
        currentPos = previous[currentPos];
    }

    reverse(ans.begin(), ans.end());
    for(int it : ans)
        fout<<it<<' ';
    fout<<'\n';

    return 0;
}