Cod sursa(job #1373477)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 4 martie 2015 18:58:50
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
using namespace std;
ofstream out ("scmax.out");

const int kNMax = 100010;
int n, val[kNMax], v[kNMax], dp[kNMax], nr;
int sol, poz_final, tata[kNMax];

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

int CautBin(int x) {
    int st = 0, dr = nr, mij = (st + dr) / 2;
    while (st <= dr) {
        if(val[v[mij]] >= x)
            dr = mij - 1;
        else
            st = mij + 1;
        mij = (st + dr) / 2;
    }
    return mij;
}

void Solve() {
    int poz;
    nr = 1;
    dp[1] = 1;
    v[1] = 1;
    for (int i = 1; i <= n; ++i) {
        poz = CautBin(val[i]);
        dp[i] = poz + 1;
        tata[i] = v[poz];
        if (v[poz + 1] == 0 || val[v[poz + 1]] > val[i])
            v[poz + 1] = i;
        nr = max(nr, poz + 1);
        if (sol < dp[i]) {
            sol = dp[i];
            poz_final = i;
        }
    }
}

void AfisRecurenta(int i) {
    if(tata[i])
        AfisRecurenta(tata[i]);
    out << val[i] << ' ';
}

void Afisare() {
    out << sol << '\n';
    AfisRecurenta(poz_final);
    out.close();
}

int main() {
    Citire();
    Solve();
    Afisare();
    return 0;
}