Cod sursa(job #1247696)

Utilizator nytr0gennytr0gen nytr0gen Data 23 octombrie 2014 13:12:57
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 100000;

int binary_search(int *A, int key, int iMin, int iMax) {
    if (iMax < iMin)
        return 0;

    int iMid;
    while (iMax - iMin > 1) {
        iMid = (iMax + iMin) / 2;
        if (A[iMid] < key)
            iMin = iMid;
        else
            iMax = iMid;
    }

    if (A[iMax] >= key)
        iMax--;

    return iMax;
}

int main() {
    int N, i, v[NMAX];

    FILE * in = fopen("scmax.in", "r");
    fscanf(in, "%d", &N);
    for (i = 0; i < N; i++)
        fscanf(in, "%d", &v[i]);
    fclose(in);

    int min[N], pre[N][N];
    for (i = 0; i <= N; i++)
        min[i] = pre[0][i] = 0;

    int L, L_max = 0;
    for (i = 0; i < N; ++i) {
        L = 1 + binary_search(min, v[i], 1, L_max);
        if (min[L] == 0 || v[i] < min[L]) {
            min[L] = v[i];

            // Save the subsequence
            copy(pre[L-1], pre[L-1]+L, pre[L]);
            pre[L][L] = i;

            if (L > L_max) L_max = L;
        }
    }

    FILE * out = fopen("scmax.out", "w");
    fprintf(out, "%d\n", L_max);
    for (i = 1; i <= L_max; i++)
        fprintf(out, "%d ", pre[L_max][i]);
    fclose(out);

    return 0;
}