Cod sursa(job #3246802)

Utilizator victorzarzuZarzu Victor victorzarzu Data 4 octombrie 2024 15:47:43
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int n, v[100005], d[100005], t[100005];

void read() {
    f>>n;
    for(int i = 1;i <= n;++i) {
        f>>v[i];
    }
}

void reconstruct(const int& x) {
    if(t[x]) {
        reconstruct(t[x]);
    }
    g<<v[x]<<" ";
}

void solve() {
    d[1] = 1;
    int len = 1;

    for(int i = 2;i <= n;++i) {
        int left = 1, right = len;
        while(left <= right) {
            int mid = (right + left) >> 1;

            if(v[d[mid]] >= v[i]) {
                right = mid - 1;
                continue;
            }
            left = mid + 1;
        }

        if(left > len) {
            len++;
            d[len] = i;
            t[i] = d[len - 1];
        } else {
            d[left] = i;
            t[i] = d[left - 1];
        }
    }
    g<<len<<'\n';
    reconstruct(d[len]);
}

int main() {
    read();
    solve();

    return 0;
}