Cod sursa(job #1653757)

Utilizator BrandonChris Luntraru Brandon Data 16 martie 2016 15:51:35
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

vector <int> ans;

int n, v[100005], previous[100005], pos[100005], pos_size = 1;

inline int bin_search(int l, int r, int val) {
    int med;

    while(l <= r) {
        med = (l + r) / 2;

        if(v[pos[med]] < val) {
            l = med + 1;
        }
        else {
            r = med - 1;
        }
    }

    return l;
}

int main() {
    cin >> n;

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

    pos[1] = 1;

    for(int i = 2; i <= n; ++i) {
        if(i == 130) {
            int a;
            a = 0;
        }

        if(v[i] > v[pos[pos_size]]) {
            ++pos_size;
            pos[pos_size] = i;
            previous[pos_size] = pos_size - 1;
        }
        else {
            int new_pos = bin_search(1, pos_size + 1, v[i]);
            pos[new_pos] = i;
            previous[new_pos] = new_pos - 1;
        }
    }

    cout << pos_size << '\n';

    for(int i = pos_size; i >= 1; i = previous[i]) {
       ans.push_back(v[pos[i]]);
    }

    for(int i = ans.size() - 1; i >= 0; --i) {
        cout << ans[i] << ' ';
    }

    cout << '\n';
    return 0;
}