Cod sursa(job #3216338)

Utilizator PescarusTanislav Luca Andrei Pescarus Data 15 martie 2024 22:12:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
using namespace std;
ifstream f("scmax.in");
    ofstream g("scmax.out");
const int nmax = 100005;
int dp[nmax], a[nmax], minval[nmax], sol[nmax], cnt, n;
void reconst(int last){
    if(sol[last]){
        reconst(sol[last]);
    }
    g << a[last] << ' ';
}
int main(){
    
    f >> n;
    for(int i = 1; i <= n; i++){
        f >> a[i];
    }
    for(int i = 1; i <= n; i++){
        if(a[i] > minval[cnt]){
            cnt++;
            minval[cnt] = a[i];
            dp[cnt] = i;
            if(cnt){
                sol[i] = dp[cnt - 1];
            } 
        }
        else{
            int poz = lower_bound(minval + 1, minval + cnt + 1, a[i]) - minval;
            minval[poz] = a[i];
            dp[poz] = i;
            if(poz){
                sol[i] = dp[poz - 1];
            }
        }
    }
    g << cnt << '\n';
    reconst(dp[cnt]);
}