Cod sursa(job #2968627)

Utilizator MAlex2019Melintioi George Alexandru MAlex2019 Data 21 ianuarie 2023 17:52:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int NMAX = 1e5 + 10;
const int INF = 1<<30;

vector<int> dp(NMAX, INF), maxim(NMAX);

int v[NMAX];

int bin(int st, int dr, int val) {
    int ans = -1;
    while (st <= dr) {
        int mid = (st + dr)/2;
        if (dp[mid] > val) {
            ans = mid;
            dr = mid - 1;
        }
        else 
            st = mid + 1;
    }

    return ans;
}

void afis(int l, int dr) {
    if (!l || !dr)
        return;

    while (dr >= 1) {
        if (maxim[dr] == l) {
            afis(l - 1, dr - 1);
            fout << v[dr] << " ";
            return;
        }
        dr--;
    }
}

int main() {
    int n, x, dr = 0; 
    fin >> n;
    dp[0] = -INF;
    for (int i = 1; i <= n; i++) {
        fin >> x;
        v[i] = x;
        if (dp[dr] < x) {
            dp[++dr] = x;
            maxim[i] = dr;
        }
        else {
            int pos = bin(0, dr, x);
            if (dp[pos - 1] == x) 
                continue;
            dp[pos] = x;
            maxim[i] = pos;
        }
    }

    fout << dr << '\n';
    afis(dr,n);

    return 0;
}