Cod sursa(job #2706020)

Utilizator divadddDavid Curca divaddd Data 13 februarie 2021 17:27:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 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;
    int sol = 0;
    while(st <= dr){
        int mid = (st+dr)/2;
        if(v[dp[mid]] >= x){
                dr = mid-1; sol = mid;
        }
        else{
            st = mid+1;
        }
    }
    if(sol == 0){
        return k+1;
    }
    return sol;
}

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];
    }
    fout << k << "\n";
    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;
}