Cod sursa(job #1997902)

Utilizator savigunFeleaga Dragos-George savigun Data 5 iulie 2017 21:01:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

const int L = 1 << 17;
int n, best, pre[100005], pos;
int v[100005];
vector<int> sol;

struct Item {
    int val = 0, pos = 0;
} length[100005];

int cauta(int val) {
    int step = L;
    int p = 0;
    while (step) {
        if (p + step <= n && length[p + step].val < val) {
            p += step;
        }
        step /= 2;
    }

    return p;
}

int main()
{
    in >> n;
    for (int i = 1; i <= n; ++i) {
        in >> v[i];
        length[i].val = 2e9 + 1;
    }

    for (int i = 1; i <= n; ++i) {
        int l = cauta(v[i]);
        l++;
        if (length[l].val > v[i]) {
            length[l].val = v[i];
            pre[i] = length[l - 1].pos;
            length[l].pos = i;
        }

        if (l > best) {
            best = l;
            pos = i;
        }
    }

    out << best << "\n";
    while (pos) {
        sol.push_back(v[pos]);
        pos = pre[pos];
    }
    for (int i = sol.size() - 1; i >= 0; --i) out << sol[i] << " ";

    return 0;
}