Cod sursa(job #1897441)

Utilizator andreinmAndrei andreinm Data 1 martie 2017 13:55:15
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>

using namespace std;

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

const int NM = 100010;
const int inf = 0x3f3f3f3f;

int N, i;
int v[NM], best[NM], prev[NM];

int get_pos(int n) {
    int res = 0;

    int left = 1; int right = n;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (v[best[mid]] < v[n + 1])
            res = mid, left = mid + 1;
        else right = mid - 1;
    }

    return res;
}

void print_lis(int n) {
    if (n == 0) return;

    print_lis(prev[n]);
    out << v[n] << ' ';
}

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

    v[0] = inf;
    for (i = 1; i <= N; ++i) {
        int current = get_pos(i - 1);
        //if (current == 0) continue;

        prev[i] = best[current];
        best[current + 1] = i;
    }

    int ans;
    for (ans = 1; best[ans+1]; ++ans);

    out << ans << '\n';
    print_lis(best[ans]);

    return 0;
}