Cod sursa(job #2250578)

Utilizator vladm98Munteanu Vlad vladm98 Data 30 septembrie 2018 14:50:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int last[100001];
int v[100001];
vector <int> dp;
vector <int> answer;


int main()
{
    ifstream cin ("scmax.in");
    ofstream cout ("scmax.out");
    int n;
    dp.push_back(0);
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
    }

    for (int i = 1; i <= n; ++i) {
        if (v[i] > v[dp.back()]) {
            last[i] = dp.back();
            dp.push_back(i);
            continue;
        }
        int currentPosition = -1;
        for (int power = 20; power >= 0; --power) {
            if (currentPosition + (1 << power) < dp.size() and v[i] > v[dp[currentPosition + (1 << power)]]) {
                currentPosition += (1 << power);
            }
        }
        currentPosition += 1;
        last[i] = dp[currentPosition - 1];
        dp[currentPosition] = i;
    }

    int current = dp.back();
    while (current) {
        answer.push_back(v[current]);
        current = last[current];
    }
    reverse(answer.begin(), answer.end());

    cout << answer.size() << '\n';
    for (auto x : answer) {
        cout << x << ' ';
    }
    return 0;
}