Cod sursa(job #2571593)

Utilizator TheGodFather2131Alexandru Miclea TheGodFather2131 Data 5 martie 2020 08:39:42
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
//ALEXANDRU MICLEA

#include <bits/stdc++.h>
using namespace std;

#include <fstream>
ifstream fin("scmax.in"); ofstream fout("scmax.out");

//VARIABLES

int n;
int v[100005];
int dp[100005];
int last[100005];
int MAX;
vector <int> ord;

//FUNCTIONS

int cautbin(int i){
    int st = 0; int dr = i - 1;
    int ans = 0;

    while (st <= dr){
        int mid = st + dr;
        mid /= 2;

        if (v[i] > v[dp[mid]]){
            ans = mid;
            st = mid + 1;
        } else {
            dr = mid - 1;
        }

    }
    return ans;
}

//MAIN
int main() {

    fin >> n;
    for (int i = 1; i <= n; i++){
        fin >> v[i];
        dp[i] = n+1;
    }
    v[n + 1] = 2e9+5;

    for (int i = 1; i <= n; i++){
        int ans = cautbin(i);

        if (v[i] < v[dp[ans + 1]]){
            dp[ans + 1] = i;
        }

        last[i] = dp[ans];
        MAX = max(MAX, ans + 1);
    }

    fout << MAX << '\n';
    int now = dp[MAX];

    while (now){
        ord.push_back(v[now]);
        now = last[now];
    }
    reverse(ord.begin(), ord.end());
    for (auto& x : ord){
        cout << x << " ";
    }

    return 0;
}