Cod sursa(job #2938132)

Utilizator Razvan_GabrielRazvan Gabriel Razvan_Gabriel Data 11 noiembrie 2022 17:53:05
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, v[100001];
int val_min[100001];
int lung[100001];

int caut_bin(int st, int dr, int val){
    int rez = st - 1;
    while(st <= dr){
        int m = (st + dr) / 2;
        if(val_min[m]  < val){
            rez = m;
            st = m + 1;
        }else
            dr = m - 1;
    }
    return rez;
}

void refac_subsirul(int p, int val, int l){
    if(l == 0)
        return;
    if(v[p] <= val && lung[p] == l){
        refac_subsirul(p - 1, v[p] - 1, l - 1);
        fout << v[p] << " ";
    }else
        refac_subsirul(p - 1, val, l);
}

int main()
{
    fin >> n;
    for(int i = 0; i < n; i++)
        fin >> v[i];

    val_min[1] = v[0];
    int nelem = 1;
    lung[0] = 1;
    for(int i = 1; i < n; i++){
        int j = caut_bin(1, nelem, v[i]);
        val_min[j + 1] = v[i];
        if(j + 1 > nelem)
            nelem = j + 1;
        lung[i] = j + 1;
    }

    int maxim = 0;
    int p = 0;
    for(int i = 0 ; i < n; i++){
        if(maxim < lung[i]){
            maxim = lung[i];
            p = i;
        }
    }

    fout << lung[p] << "\n";
    refac_subsirul(p, v[p], lung[p]);

    return 0;
}