Cod sursa(job #2794864)

Utilizator Andrei_TudorAndrei Tudor Andrei_Tudor Data 5 noiembrie 2021 16:20:27
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");

int v[100005], dp[100005], lg[100005], rasp[100005];

int up_bound(int st, int dr, int k){
    int mij, last;
    while(st <= dr){
        mij = (dr + st) / 2;
        if(k <= v[lg[mij]]){
            dr = mij - 1;
            last = mij;
        }
        else {
            st = mij + 1;
        }
    }
    return last;
}

int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++){
        cin >> v[i];
    }
    for(int i = 1; i <= 10001; i ++){
        lg[i] = n + 1;
    }
    v[n + 1] = 2000000005;
    for(int i = 1; i <= n; i ++){
        int poz = up_bound(1, n, v[i]);
        lg[poz] = i;
        dp[i] = lg[poz - 1];
    }
    int r = 1;
    for(int i = 1; i <= n + 1; i ++){
        if(lg[i] == n + 1){
            r = i - 1;
            i = n + 2;
        }
    }
    cout << r << "\n";
    int k = lg[r], x = 0;
    while(k){
        rasp[++ x] = k;
        k = dp[k];
    }
    for(int i = r; i >= 1; i --){
        cout << v[rasp[i]] << " ";
    }
    return 0;
}