Cod sursa(job #2349791)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 20 februarie 2019 18:32:15
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;
const int NMAX = 100003;

int N, nr, poz, maxim;
int v[NMAX], best[NMAX], L[NMAX], p[NMAX];


int afisare(int i){
    if(p[i] > 0)
        afisare(p[i]);
    printf("%d ", v[i]);
}

int binar(int x){
    int p, u, m;
    p = 0; u = nr; m = (p + u) / 2;
    while(p <= u){
        if(v[L[m]] < x && v[L[m + 1]] >= x)
            return m;
        else if(v[L[m + 1]] >= x){
            p = m + 1;
            m = (p + u) / 2;
        } else {
            u = m - 1;
            m = (p + u) / 2;
        }
    }
    return nr;
}

int main(){

    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    scanf("%d", &N);
    for(int i = 1; i <= N; i++)
        scanf("%d", &v[i]);

    nr = 1;
    L[0] = 0; L[1] = best[1] = 1;

    for(int i = 2; i <= N; i++){
        poz = binar(v[i]);
        p[i] = L[poz];
        best[i] = poz + 1;
        L[poz + 1] = i;
        if(nr < poz + 1)
            nr = poz + 1;
    }

    for(int i = 1; i <= N; i++){
        if(maxim < best[i]){
            maxim = best[i];
            poz = i;
        }
    }

    printf("%d\n", maxim);
    afisare(poz);

    return 0;
}