Cod sursa(job #911428)

Utilizator octavianOctavian Crintea octavian Data 11 martie 2013 17:16:54
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <stdlib.h>

int LIS(const int *seq, int n, int *subseq);
int binarySearch(const int *a, int n, int x);

int main(void)
{
    int n, m, i;
    int *seq, *subseq;
    
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    scanf("%d", &n);
    seq = (int *) malloc(n * sizeof(int));
    for (i = 0; i < n; i++) {
        scanf("%d", seq + i);
    }

    subseq = (int *) malloc(n * sizeof(int));
    m = LIS(seq, n, subseq);

    printf("%d\n", m);
    for (i = 0; i < m; i++) {
        printf("%d ", subseq[i]);
    }
    printf("\n");

    free(seq);
    free(subseq);
    
    return 0;
}

int LIS(const int *seq, int n, int *subseq)
{
    int i, k, lenq;
    int *q, *p;

    q = subseq;                 /* Aici voi avea LIS */
    lenq = 0;                   /* Lungimea lui q */
    p = (int *) malloc(n * sizeof(int));

    for (i = 0; i < n; i++) {
        k = binarySearch(q, lenq, seq[i]);
        if (k >= lenq) {
            lenq++;
        }
        q[k] = seq[i];
        p[i] = k;
    }

    k = lenq - 1;
    for (i = n - 1; i >= 0; i--) {
        if (p[i] == k) {
            q[k--] = seq[i];
        }
    }

    free(p);

    return lenq;
}

int binarySearch(const int *a, int n, int x)
{
    int i = 0, j = n - 1, m;

    while (i <= j) {
        m = ((i + j) >> 1);

        if (x == a[m]) {
            return m;
        }

        if (x <= a[m]) {
            j = m - 1;
        } else {
            i = m + 1;
        }
    }
    
    return i;
}