Cod sursa(job #1653803)

Utilizator BrandonChris Luntraru Brandon Data 16 martie 2016 16:32:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 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, ans = 0;

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

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

    return ans;
}

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(v[i] > v[pos[pos_size]]) {
            ++pos_size;
            pos[pos_size] = i;
            previous[i] = pos[pos_size - 1];
        }
        else {
            int new_pos = bin_search(0, pos_size, v[i]);
            pos[new_pos + 1] = i;
            previous[i] = pos[new_pos];
        }
    }

    cout << pos_size << '\n';

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

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

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