Cod sursa(job #1968211)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 17 aprilie 2017 15:46:22
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

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

int n;
int a[nmax];

int best[nmax], frm[nmax];

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

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

    return res;
}

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

        best[pos] = i; frm[i] = best[pos-1];
    }
}

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

    vector < int > all;
    for (int i = best[ans]; i; i = frm[i])
        all.push_back(a[i]);

    reverse(all.begin(), all.end());
    for (auto &it: all) printf("%d ", it);
    printf("\n");
}

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

    input();
    compute_scmax();
    output();

    return 0;
}