Cod sursa(job #1106292)

Utilizator manutrutaEmanuel Truta manutruta Data 12 februarie 2014 18:20:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
using namespace std;

#define MAXN 100005

ifstream f("scmax.in");
ofstream g("scmax.out");

int n;
int v[MAXN];
int maxl, maxp;
int prrev[MAXN];
int len[MAXN];
int aux[MAXN];

int search(int x) {
    int st = 0, dr = maxl;
    while (st <= dr) {
        int mdl = st + ((dr - st) >> 1);
        if (v[aux[mdl]] < x && x <= v[aux[mdl + 1]]) {
            return mdl;
        } else if (v[aux[mdl]] < x) {
            st = mdl + 1;
        } else {
            dr = mdl - 1;
        }
    }
    return maxl;
}

void remake(int nd) {
    if (nd == 0) {
        return;
    }
    remake(prrev[nd]);
    g << v[nd] << ' ';
}

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

    maxl = 1;
    aux[1] = 1;
    aux[0] = 0;
    len[1] = 1;

    for (int i = 2; i <= n; i++) {
        int pos = search(v[i]);
        prrev[i] = aux[pos];
        len[i] = pos + 1;
        aux[pos + 1] = i;

        maxl = max(maxl, len[i]);

        if (len[maxp] < len[i]) {
            maxp = i;
        }
    }

    g << maxl << endl;
    remake(maxp);

    return 0;
}