Cod sursa(job #2795268)

Utilizator domistnSatnoianu Dominic Ioan domistn Data 6 noiembrie 2021 10:21:52
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <stack>
#include <algorithm>

#define NMAX 100005

using namespace std;

int n, pn = 1, a[NMAX], s[NMAX], sl, p[NMAX];

inline int cb(const int X) {
    int i, l;
    for(i = n, l = pn; l; l >>= 1)
        if(i - l >= 1 && a[i - l] >= X) i -= l;
    return i;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    while(pn < n) pn <<= 1;
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        if(s[sl] < a[i]) {
            s[++sl] = a[i];
            p[i] = sl;
        } else {
            p[i] = cb(a[i]);
            s[p[i]] = a[i];
        }
    }
    for(int i = 1; i <= n; ++i) cout << p[i] << " "; cout << "\n";
    printf("%d\n", sl);
    stack<int> ans;
    for(int i = n; i; --i)
        if(p[i] == sl)
            ans.push(a[i]), --sl;
    while(!ans.empty()) printf("%d ", ans.top()), ans.pop();
    return 0;
}