Cod sursa(job #275481)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 10 martie 2009 14:57:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#include<string.h>

#define N 100002

int v[N], a[N], tata[N], q[N], n, i, u;

inline int cautbin(int x){
     int lo, hi, mid, last = 0;

     for (lo = 0, hi = n; lo <= hi; ){

         mid = lo + (hi-lo) / 2;

         if (v[mid] != -1){
            if (a[v[mid]] < x) last = mid, lo = mid+1;
                else hi = mid - 1;
            }
         else hi = mid-1;
     }
     return last;
}

int main(){
int poz, max;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d", &n);
    for (i = 1; i <= n; i++) scanf("%d", &a[i]);

    memset(v, -1, sizeof(v)); v[0] = 0;

    for (i = 1; i <= n; i++){

        poz = cautbin(a[i]);

        if (v[poz+1] == -1 || a[v[poz+1]] > a[i]){
            if (v[poz+1] == -1) max = poz + 1;
            v[poz+1] = i;
            tata[i] = v[poz];
        }
    }

    for (i = v[max]; i > 0; i = tata[i])
        q[++u] = a[i];


    printf("%d\n", max);
    for (; u; u--)
        printf("%d ", q[u]);

    return 0;
}