Cod sursa(job #2169592)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 14 martie 2018 16:15:08
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

const int NMAX = 100005;

using namespace std;

int n, a[NMAX];
vector<int> s1;
stack<int> s2;

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

int lg;

void solve()
{
    for (int i = 1; i <= n; i++)
    {
        auto it = upper_bound(s1.begin(), s1.end(), a[i], [](const int &x, const int &y) { return x <= y; });
        if (it == s1.end())
        {
            s1.push_back(a[i]);
            lg = s1.size();
            s2.push(s1.size());
            continue;
        }
        int pos = it - s1.begin();
        lg = max(lg, pos);
        s1[pos] = a[i];
        s2.push(pos + 1);
    }

    while(!s2.empty() && s2.top() != lg)
        s2.pop();

    vector<int> result;

    for (int i = n; !s2.empty(); i--, s2.pop())
    {
        int x = s2.top();
        if (x == lg) {
            result.push_back(i);
            lg--;
        }
    }
    printf("%d\n", result.size());
    reverse(result.begin(), result.end());

    for (int i : result)
        printf("%d ", a[i]);
}

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

    read();
    solve();

    return 0;
}