Cod sursa(job #2224760)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 24 iulie 2018 23:34:24
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

int binSearch(const vector<pair<int,int>>& v, int key){
    int l = 0, r = (int)v.size() - 1;
    int found = -1;

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

        if (v[m].first < key){
            found = m;
            r = m - 1;
        }
        else{
            l = m + 1;
        }
    }

    return found;
}

int main() {
//    ifstream cin("data.txt");
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");

    ios_base::sync_with_stdio(false);

    int N;
    cin >> N;

    vector<int> A(N);

    for (int &x: A)
        cin >> x;

    vector<pair<int,int>> scmax;
    vector<int> prev(N, -1);
    vector<int> cnt(N, 0);

    for (int i = 0; i < N; i++){
        int p = binSearch(scmax, A[i]);

        if (p == -1){
            scmax.emplace_back(A[i], i);
            cnt[i] = 1;
        }
        else{
            prev[i] = scmax[p].second;
            cnt[i] = cnt[scmax[p].second] + 1;
            scmax[p].first = A[i];
            scmax[p].second = i;
        }
    }

    auto p = max_element(cnt.begin(), cnt.end()) - cnt.begin();

    cout << cnt[p] << endl;

    vector<int> s;
    int e = p;

    while (e != -1){
        s.push_back(A[e]);
        e = prev[e];
    }

    reverse(s.begin(), s.end());

    for (int x: s)
        cout << x << " ";
    cout << endl;

    return 0;
}