Cod sursa(job #983368)

Utilizator manutrutaEmanuel Truta manutruta Data 11 august 2013 16:49:18
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
# include <iostream>
# include <fstream>
# include <cmath>
using namespace std;

# define MAXN 100010

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

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

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

void recover(int i)
{
    if (prrev[i] > 0) {
        recover(prrev[i]);
    }
    g << v[i] << ' ';
}

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

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

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

        maxl = max(maxl, pos + 1);

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

    g << maxl << endl;
    /*for (int i = 1; i <= n; i++) {
        cout << prrev[i] << ' ';
    }*/

    recover(maxp);

    return 0;
}