Cod sursa(job #1043461)

Utilizator caliuxSegarceanu Calin caliux Data 28 noiembrie 2013 17:15:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#define NMAX 100005

using namespace std;

int P[NMAX], V[NMAX], Q[NMAX], SOL[NMAX], N, i;

int cauta(int key){
    int st = 1, dr = Q[0], m, p = -1;
    while(st <= dr){
        m = (st + dr)/2;
        if(Q[m] >= key){
            p = m;
            dr =  m - 1;
        }else{
            st = m + 1;
        }
    }
    return p;
}

int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &N);
    for(i = 1; i <= N; i++){
        scanf("%d", &V[i]);
    }
    P[1] = 1; Q[1] = V[1]; Q[0] = 1;
    int poz;
    for(i = 2; i <= N; i++){
        poz = cauta(V[i]);
        if(poz == -1){
            Q[++Q[0]] = V[i];
            P[i] = Q[0];
        }else{
            Q[poz] = V[i];
            P[i] = poz;
        }
    }
    poz = N;
    for(i = Q[0]; i >= 1; i--){
        while(P[poz] != i){
            poz--;
        }
        SOL[i] = V[poz];
    }
    printf("%d\n", Q[0]);
    for(i = 1; i <= Q[0]; i++){
        printf("%d ", SOL[i]);
    }

}