Cod sursa(job #2706006)

Utilizator divadddDavid Curca divaddd Data 13 februarie 2021 17:11:45
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#define MAX 100002
using namespace std;
int n,k,v[MAX],dp[MAX],tata[MAX],rez[MAX];

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

int cautareBinara(int x){
    /// cel mai mic element >= x
    int st = 1,dr = k;
    while(st <= dr){
        int mid = (st+dr)/2;
        if(v[dp[mid]] >= x){dr = mid-1;}
        else{st = mid+1;}
    }
    return st;
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
    k = 1;
    dp[k] = 1;
    for(int i = 2; i <= n; i++){
        /// determin dp[i];
        int r = cautareBinara(v[i]);
        dp[r] = i;
        if(r > k){
            k = r;
        }
        tata[i] = dp[r-1];
    }
    int poz = dp[k];
    for(int i = k; i >= 1; i--){
        rez[i] = v[poz];
        poz = tata[poz];
    }
    for(int i = 1; i <= k; i++){
        fout << rez[i] << " ";
    }
    return 0;
}