Cod sursa(job #2465412)

Utilizator Bulboaca_EugenBulboaca Alexandru Eugen Bulboaca_Eugen Data 30 septembrie 2019 09:17:25
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAXN = 1e5 + 5;
vector <int> ans;
int dp[MAXN] , last[MAXN], v[MAXN];
int binary_Search(int n, int l){
    int current = 0;
    for(int power = 30; power >= 0; --power){
        int k = current + ( 1 << power );
        if(k <= l and v[dp[k]] < v[n])
            current += (1 << power);
    }
    current++;
    return current ;

}
int main(){
    int n, l = 0;
    fin >> n;
    for(int i = 1; i <= n; ++i){
        fin >> v[i];
    }
    dp[0] = 0, last[0] = -1, v[0] = -1 ;
    for(int i = 1; i <= n; ++i){
        int k = binary_Search(i, l);
        l = max(k , l);
        dp[k] = i;
        last[i] = dp[k - 1];
    }
    int indice = dp[l] ;
    ans.push_back(indice);
    while(last[indice] > 0){
        ans.push_back(last[indice]);
        indice = last[indice];
    }
    fout << l << '\n';
    for(int i = ans.size() - 1; i >= 0; --i)
        fout << v[ans[i]] << " ";
    return 0;
}