Cod sursa(job #865032)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 ianuarie 2013 22:55:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <cstdio>
using namespace std;

#define Nmax 100001

int n, maxim, k , nr = 1;

int v[Nmax], p[Nmax], L[Nmax], best[Nmax];

void citire(){

    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;
}

inline int search(int x){

    int p = 0, u = nr, m = (p + u) >> 1;

    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) >> 1;
            else
                u = m - 1,
                m = (p + u) >> 1;
    }

    return nr;
}

void afis(int i){

   if(p[i] > 0)
        afis(p[i]);

   printf("%d ", v[i]);
}

void dinamica(){

    int poz;

    for(int i = 2; i <= n; i++){

        poz = search(v[i]);
        p[i] = L[poz];
        best[i] = poz + 1;
        L[poz + 1] = i;

        if(nr < poz + 1)
            nr = poz + 1;
    }

    maxim = poz = 0;

    for(int i = 1; i <= n; i++)
        if(maxim < best[i])
            maxim = best[i],
            poz = i;

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

    afis(poz);
}



int main(){

    citire();
    dinamica();

    return 0;
}