Cod sursa(job #1906549)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 6 martie 2017 14:47:03
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 1e5 + 10;
const int inf = 2e9 + 10;

int n;
int a[nmax], bst[nmax], prv[nmax];

void input() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
}

int get_pos(int p, int x) {
    int res = 0;

    int left = 0; int right = p - 1;
    while (left <= right) {
        int mid = (left + right) >> 1;
        if (a[bst[mid]] < x)
            res = mid, left = mid + 1;
        else right = mid - 1;
    }

    return res;
}

void solve() {
    a[0] = inf;
    for (int i = 1; i <= n; ++i) {
        int pos = get_pos(i, a[i]);
        if (pos == inf) continue;

        bst[pos+1] = i;
        prv[i] = bst[pos];
    }
}

void output() {
    int ans;
    for (ans = 1; bst[ans+1]; ++ans);
    printf("%d\n", ans);

    vector < int > v;
    for (int i = bst[ans]; i; i = prv[i])
        v.push_back(a[i]);
    reverse(v.begin(), v.end());
    for (auto &it: v) printf("%d ", it);
}

int main() {
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    input();
    solve();
    output();


    return 0;
}