Cod sursa(job #3195836)

Utilizator Allie28Radu Alesia Allie28 Data 21 ianuarie 2024 20:35:01
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <climits>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int LMAX = 100005;
int v[LMAX], index[LMAX], dp[LMAX];
vector<int> ans;

int main() {
    int n, i;
    fin>>n;
    for (i = 1; i <= n; i++) {
        fin>>v[i];
    }
    int s, d, mij, lmax;
    dp[0] = -1; //dp[i] indicele retine elementului minim cu care se termina o secventa de lungime i
    lmax = 0;
    for (i = 1; i <= n; i++) {
        s = 0;
        d = lmax + 1;
        while (s + 1 != d) {
            mij = ((s + d) >> 1);
            if (v[dp[mij]] >= v[i]) {
                d = mij;
            }
            else s = mij;
        }
        if (dp[s + 1] == 0 || v[dp[s + 1]] > v[i]) {
            dp[s + 1] = i;
            index[i] = dp[s];
            lmax = max(lmax, s + 1);
        }
    }
    int x = dp[lmax];
    while (x != -1) {
        ans.push_back(v[x]);
        x = index[x];
    }
    fout<<lmax<<endl;
    for (i = ans.size() - 1; i >= 0; i--) fout<<ans[i]<<" ";



    fin.close();
    fout.close();
    return 0;
}