Cod sursa(job #2451352)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 26 august 2019 15:56:04
Problema Subsir crescator maximal Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <stack>

using namespace std;

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

const int inf = 0x3f3f3f3f;

int v[100005], d[100005], prec[100005], n;
stack <int> st;

int cautbin (int val){
    int st = 1, dr = n;
    while (st <= dr){
        int mij = (st + dr) / 2;
        if (v[d[mij]] >= val)
            dr = mij - 1;
        else
            st = mij + 1;
    }
    return st - 1;
}

int main(){
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    v[0] = inf;
    for (int i = 1; i <= n; i++){
        int l = cautbin(v[i]);
        if (v[i] < v[d[l + 1]]){
            prec[i] = d[l];
            d[l + 1] = i;
        }
    }
    int lmax = 0, poz = 0;
    for (int i = n; i >= 1; i--)
        if (d[i] > 0){
            lmax = i;
            poz = d[i];
            break;
        }
    fout << lmax << '\n';
    while (poz){
        st.push(v[poz]);
        poz = prec[poz];
    }
    while (!st.empty()){
        fout << st.top() << ' ';
        st.pop();
    }
    fout << '\n';
    return 0;
}