Cod sursa(job #813007)

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