Cod sursa(job #1976922)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 4 mai 2017 16:06:01
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100002
#define INF 1e9

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

int v[NMAX], D[NMAX], val[NMAX], pred[NMAX], poz[NMAX];

void remake(int poz) {

    if (poz == 0)
        return;

    remake(pred[poz]);
    fout << v[poz] << " ";
}

int cbinara(int st, int dr, int x) {

    int mid, sol = 0;

    while (st <= dr) {
        mid = (st + dr) >> 1;

        if (val[mid] < x) {
            sol = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }

    return sol;
}

int main() {

    int N;

    fin >> N;

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

    int bestVal = 0, bestPoz = 0;
    for (int i = 1; i <= N; ++i) {

        int p = cbinara(0, bestVal, v[i]);

        D[i] = 1 + p;
        pred[i] = poz[p];

        if (val[D[i]] > v[i]) {
            val[D[i]] = v[i];
            poz[D[i]] = i;
        }

        if (D[i] > bestVal) {
            bestVal = D[i];
            bestPoz = poz[D[i]];
        }
    }

    fout << bestVal << "\n";
    remake(bestPoz);

    return 0;
}