Cod sursa(job #3004016)

Utilizator not_anduAndu Scheusan not_andu Data 16 martie 2023 08:42:19
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include<fstream>

using namespace std;

#define INFILE "scmax.in"
#define OUTFILE "scmax.out"

ifstream fin (INFILE);
ofstream fout (OUTFILE);

int i , n , st , dr , p , poz;
int x[100005] , v[100005] , ant[100005];

int cb (int left , int right , int c){
    int poz = 0;
    while (left <= right){
        int mij = (left + right) / 2;
        if (c > v[x[mij]]){
            poz = mij;
            left = mij + 1;
        }
        else{
            right = mij - 1;
        }
    }
    return poz;
}

void afisare (int k){
    if (ant[k]){
        afisare (ant[k]);
    }
    fout << v[k] << " ";
}

void solve(){
    fin >> n;

    for (i = 1 ; i <= n ; i++){
        fin >> v[i];
    }
        
    x[1] = 1;
    st = 1;
    dr = 1;

    for (i = 2 ; i <= n ; i++){
        
        int p = cb (st , dr , v[i]);

        if(p == dr){
            dr++;
        }
        
        x[p+1] = i;
        ant[i] = x[p];

    }

    fout << dr << '\n';

    afisare (x[dr]);
}

int main(){
    solve();
    return 0;
}