Cod sursa(job #1870503)

Utilizator roxannemafteiuMafteiu-Scai Roxana roxannemafteiu Data 6 februarie 2017 18:22:58
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

const int N_MAX = 1e5 + 5;
const int INF = 0;

int n, maxim = 1;
int dp[N_MAX], v[N_MAX], sol[N_MAX];

void read() {
    ifstream fin("scmax.in");

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

    fin.close();
}

void solve() {
    int index;
    dp[1] = v[1];
    sol[1] = 1;

    for (int i = 2; i <= n; ++i) {
        int *posv = upper_bound(dp + 1, dp + maxim + 1, v[i]);
        index = posv - dp;
        if (v[i] == dp[index - 1]) {
            --index;
        }

        if (index > maxim) {
           maxim  = index;
        }

        sol[i] = index;
        dp[index] = v[i];
    }

    int x = maxim;
    for (int i = n; i >=1; --i) {
        if (sol[i] == x) {
            dp[x] = v[i];
            --x;
        }
    }
}

void write() {
    ofstream fout("scmax.out");

    fout << maxim << "\n";

    for (int i = 1; i <= maxim; ++i) {
        fout << dp[i] << " ";
    }

    fout.close();
}

int main() {
    read();
    solve();
    write();

    return 0;
}