Cod sursa(job #457924)

Utilizator purdea.andreiPurdea Andrei purdea.andrei Data 22 mai 2010 02:54:38
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <stdlib.h>
int X[100001];
int n;
int M[100001];
int L;
int P[100001];

int b_search(int val) {
    if (L==0) return 0;

    int s = 1, e = L;
    
    while (s<e) {
        int m = (s + e) / 2;
        int valm = X[M[m]];
        if (valm >= val)
            e = m-1;
        else
            s = m+1;
    }
    while (s!=0 && X[M[s]] > val) s--;
    while (s == 0 || (s <= L && X[M[s]] < val)) s++;
    s--;
    if (s<=0) return 0;
    return s;
    int i;
    for (i=L;i>=1;i--) {
        if (X[M[i]]<val) return i;
    }
    return 0;
}

int main() {
    int i, j;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d" , &n);
    for (i=0;i<n;i++) scanf("%d", &X[i]);
    L = 0;
    for (i=0;i<n;i++) {
        int j = b_search(X[i]);
        P[i] = j;
        if (L==j || X[M[j+1]]>X[i]) {
            M[j+1] = i;
            if (j+1>L) L = j+1;
        }
    }
    i = M[L]; j = 0;
    while(1) {
        M[j] = X[i];
        if (i==0) break;
        j++;
        i = P[i];
    }
    printf("%d\n", L);
    for (i=L-1;i>=0;i--) printf("%d ", M[i]);
    printf("\n");
}