Cod sursa(job #2932110)

Utilizator divadddDavid Curca divaddd Data 1 noiembrie 2022 21:49:18
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <fstream>
#define MAX 100002
using namespace std;
int n,k,v[MAX],dp[MAX],t[MAX],sol[MAX];

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int cb(int val){
    /// 0 0 0 0 1 1 1 1
    ///         ^
    /// f() >= val
    int st = 1, dr = k, ans = 0;
    while(st <= dr){
        int mid = (st+dr)/2;
        if(v[dp[mid]] >= val){
            ans = mid;
            dr = mid-1;
        }else{
            st = mid+1;
        }
    }
    return ( (ans == 0)?(k+1):ans );
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
    k = 1;
    dp[k] = 1;
    for(int i = 1; i <= n; i++){
        int eval = cb(v[i]);
        dp[eval] = i;
        k = max(k, eval);
        t[i] = dp[eval-1];
    }
    int pos = dp[k];
    for(int i = k; i >= 1; i--){
        sol[i] = v[pos];
        pos = t[pos];
    }
    for(int i = 1; i <= k; i++){
        fout << sol[i] << " ";
    }
    return 0;
}