Cod sursa(job #1898845)

Utilizator andreinmAndrei andreinm Data 2 martie 2017 12:11:17
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int NM = 100010;
int n, i, len, pos;
int best[NM], prv[NM], d[NM];
vector <int> alt;

int get_pos(int x) {
    if (x == 1)
    return x;

    int lo = 1, hi = x;
    while (lo <= hi) {
        int mid = lo + (hi - lo)/2;
        if (d[x] <= d[best[mid]]) {
            hi = mid - 1;
            pos = mid;
        }
        else if (d[best[mid]] == 0)
                return mid;
        else {
            lo = mid + 1;
        }
    }
    return pos;
}

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


    for (i = 1; i <= n; ++i) {
        pos = get_pos(i);
        best[pos] = i;
        if (pos == 1)
            prv[best[pos]] = 0;
        else
            prv[best[pos]] = best[pos-1];
    }
    i = 1;
    while (best[i]) i++;

    len = i-1;
    out << len << '\n';
    len = best[len];
    prv[0] = -12345;
    while (prv[len] != prv[0]) {
        alt.push_back(d[len]);
        len = prv[len];
    }
    reverse(alt.begin(), alt.end());
    for (auto &it: alt) {
        out << it << ' ';
    }

    return 0;
}