Cod sursa(job #2742276)

Utilizator DragosC1Dragos DragosC1 Data 20 aprilie 2021 18:04:54
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;

int n, a[100001], nr, dp[100001], l, v[100001], sol[100001], cl;

void read() {
    int i;
    ifstream f("scmax.in");
    f >> n;
    for (i = 1; i <= n; i++) 
        f >> a[i];
    f.close();
}

int cautare_binara(int x) {
    int st, dr, mij, answer;
    st = 1, dr = l;
    while (st <= dr) {
        mij = (st + dr) / 2;
        if (v[mij] >= x) {
            dr = mij - 1;
            answer = mij;
        }
        else st = mij + 1;
    }
    v[answer] = x;
    return answer;
}

void solve() {
    int i;
    for (i = 1; i <= n; i++)
        if (a[i] > v[l]) {
            dp[i] = l + 1;
            v[++l] = a[i];
        } 
        else 
            dp[i] = cautare_binara(a[i]);
    cl = l;
    for (i = n; i >= 1; i--)
        if (dp[i] == l) {
            sol[l] = a[i];
            l--;
        }
}

void output() {
    ofstream g("scmax.out");
    int i;
    g << cl << '\n';
    for (i = 1; i <= cl; i++)
        g << sol[i] << ' ';
    g.close();
}

int main() {
    read();
    solve();
    output();
    return 0;
}