Cod sursa(job #2498577)

Utilizator sansRotaru Razvan Andrei sans Data 24 noiembrie 2019 02:02:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
using namespace std;
int v[100005], best[100005], p[100005], maxim, k, L[100005], nr, n;
int binsearch(int x){
    int p = 0, u = nr, m =(p + u) / 2;
    while(p <= u){
        if(v[L[m]] < x && v[L[m+1]] >= x) return m; // am gasit locul unde vrem sa inseram
        else if(v[L[m+1]] < x){
            p = m + 1;
            m = (p+u)/2;
        }
        else{
            u = m-1;
            m = (p+u)/2;
        }
    }
    return nr; // n-am gasit, returnam ultimul index
}
void afis(int i){
    if(p[i] > 0) afis(p[i]);
    printf("%d ", v[i]);
}
int main(){
    int poz;
    nr = 1;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", v + i);
    best[1] = L[1] = 1;
    L[0] = 0;
    for(int i = 2; i <= n; i++){
        poz = binsearch(v[i]);
        p[i] = L[poz];
        best[i] = poz + 1;
        L[poz + 1] = i;
        if(nr < poz + 1) nr = poz + 1; // incrementam nr daca am adaugat un element
    }
    maxim = 0, poz = 0;
    for(int i = 1; i <= n; i++)
        if(maxim < best[i]) {
            maxim = best[i];
            poz = i;
        }
    printf("%d\n", maxim);
    afis(poz);
}