Cod sursa(job #3277848)

Utilizator tudorpisica@gmail.comPisica Tudor [email protected] Data 17 februarie 2025 15:30:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#define Nmax 100099
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");

int N, v[Nmax], L, last[Nmax], ante[Nmax];

void SCMAX() {
    L = 1; // lungimea maxima gasita
    last[1] = 1; // ultimul sir maximal de lungime 1 s-a incheiat pe poz 1
    for (int i = 2; i <= N; ++i) {
        int st = 1, dr = L;
        while (st <= dr) {
            int mij = (st + dr) >> 1;
            if (v[i] > v[last[mij]]) { // v[i] poate extinde SIGUT sirul care se terminca cu v[ last[ mij] ] , poate chiar mai mult
                st=mij+1;
            } else { // v[i] trebuie sa extinda un sir al carui termen maxim e mai mare decat v[ last[ mij] ]
                dr=mij-1;
            }
        }
        if (st == L+1) {
            ++L; // am o noua solutie!
        }
        last[st] = i;
        ante[i] = last[st-1];
    }
}
void Build(int poz) {
    if (ante[poz]) {
        Build(ante[poz]);
    }
    g << v[poz] << ' ';
}

int main () {
    f >> N;
    for (int i = 1; i <= N; ++i) {
        f >> v[i];
    }
    SCMAX();
    g << L << '\n';
    Build(last[L]);
    return 0;
}