Cod sursa(job #1887784)

Utilizator RobybrasovRobert Hangu Robybrasov Data 21 februarie 2017 19:23:25
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100001
#define FOR(i, n) for (int i = 0; i < n; ++i)

int main() {
    FILE *f = fopen("scmax.in", "r");
    int n;
    fscanf(f, "%d", &n);

    int *A = (int*) malloc(n * sizeof(int));
    int *P = (int*) malloc(n * sizeof(int));
    int *M = (int*) malloc(n * sizeof(int));

    FOR(i, n)
        fscanf(f, "%d", &A[i]);
    fclose(f);

    int maxLen = 0, maxVal = 0, maxPos = 0, step, pos;
    FOR(i, n) {
        // Binary search the value in M
        for (step = 1; step < maxLen; step <<= 1);
        for (pos = 0; step; step >>= 1) {
            int np = pos + step;
            if (np <= maxLen && A[M[np]] < A[i])
                pos += step;
        }
        if (pos + 1 > maxVal) {
            maxVal = pos + 1;
            maxPos = i;
        }
        if (pos == 0)
            P[i] = -1;
        else 
            P[i] = M[pos];
        if (pos == maxLen)
            M[++maxLen] = i;
        else if (A[i] < A[M[pos + 1]])
            M[pos + 1] = i;
    }

    f = fopen("scmax.out", "w");
    fprintf(f, "%d\n", maxVal);
    step = 0;
    for (int p = maxPos; p != -1; p = P[p])
        M[step++] = p;
    for (--step; step > -1; --step)
        fprintf(f, "%d ", A[M[step]]);
    fprintf(f, "\n");

    free(A);
    free(P);
    free(M);

    return 0;
}