Cod sursa(job #813064)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 14 noiembrie 2012 21:16:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <stdio.h>
#define N_MAX 100010
int v[N_MAX], best[N_MAX], pre[N_MAX];
int k, n, pozSol;
void add(int x, int p) {
    int step = 0, poz = 0;
    for( ; (1<<step) < k; step++);
    for(int i = step; i >= 0; i--) {
        if( poz + (1<<i) <= k && v[best[poz + (1<<i)]] < x) {
            poz += (1<<i);
        }
    }
    poz++;
    if(poz > k) {
        k++;
        pozSol = p;
    }
    best[poz] = p;
    pre[p] = best[poz-1];
}
void afisare(int p) {
    if(p == 0) return ;
    afisare(pre[p]);
    printf("%d ", v[p]);
}
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]);
        add(v[i], i);
    }
    printf("%d\n", k);
    afisare(pozSol);
    return 0;
}