Cod sursa(job #823383)

Utilizator badmanDragan Dan badman Data 24 noiembrie 2012 22:32:07
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>

int binary_search(int x, int V[], int low, int high, int mid) {
    if(low <= high) {
        mid = (low + high) / 2;
        if(x == V[mid])
            return mid;
        if(x < V[mid])
            return binary_search(x, V, low, mid - 1, mid);
        else
            return binary_search(x, V, mid + 1, high, mid);
    }
    else
        return low;
}

int main() {

    FILE *input = fopen("scmax.in", "r");
    FILE *output = fopen("scmax.out", "w");
    int n;
    fscanf(input, "%d", &n);
    int *V = malloc(n * sizeof(int));
    int i, poz, nr = 0, k = 1, mid = 0;
    for(i = 0; i < n; i++)
        fscanf(input, "%d", &V[i]);
    fclose(input);
    int *P = calloc(n, sizeof(int));
    int *Q = calloc(n, sizeof(int));
    Q[0] = V[0];
    P[0] = 0;
    for(i = 1; i < n; i++) {
        poz = binary_search(V[i], Q, 0, nr, mid);
        if(poz > nr) {
            nr++;
            Q[nr] = V[i];
        }
        else
            Q[poz] = V[i];
        P[k++] = poz;
    }
    fprintf(output, "%d\n", nr + 1);
    int copie = nr;
    for(i = n - 1; i >= 0; i--) {
        if(P[i] == copie) {
            Q[copie] = i;
            copie --;
        }
    }
    for(i = 0; i <= nr; i++)
        fprintf(output, "%d ", V[Q[i]]);

    fclose(output);
    free(V);
    free(P);
    free(Q);
    return 0;
}