Cod sursa(job #2856415)

Utilizator vansJos da pa perete vans Data 23 februarie 2022 20:17:21
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>

using namespace std;

const int NMAX = 1e5;

int n, a[NMAX + 1], dp[NMAX + 1], dpl, t[NMAX + 1];

inline int cb(const int Q) {
    int st = 1, dr = dpl, mij, ans;
    while(st <= dr) {
        mij = (st + dr) / 2;
        if(a[dp[mij]] >= a[Q]) dr = mij - 1, ans = mij;
        else st = mij + 1;
    }
    return ans;
}

void printSol(const int X) {
    if(t[X]) printSol(t[X]);
    printf("%d ", a[X]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    dp[dpl = 1] = 1;
    for(int i = 2; i <= n; ++i)
        if(a[dp[dpl]] < a[i]) {
            dp[++dpl] = i;
            t[i] = dp[dpl - 1];
        } else {
            const int crt = cb(i);
            dp[crt] = i;
            t[i] = dp[crt - 1];
        }
    printf("%d\n", dpl);
    printSol(dp[dpl]);
    return 0;
}