Cod sursa(job #764874)

Utilizator igsifvevc avb igsi Data 6 iulie 2012 16:28:07
Problema Subsir crescator maximal Scor 65
Compilator c Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>

int subseqLen[100001], seq[100001], N, maxLen;

int findBest(int k);

int main()
{
    FILE *in, *out;
    int i, best;

    /*reading the input*/
    in = fopen("scmax.in", "r");
    fscanf(in, "%d", &N);
    for(i = 0; i < N; i++)
        fscanf(in, "%d", &seq[i]);
    fclose(in);
    /*done reading the input*/

    for(i = 0; i < N; i++)
    {
        best = findBest( seq[i] );
        if(best == maxLen)
            subseqLen[++maxLen] = seq[i];
        else if(subseqLen[best+1] > seq[i])
            subseqLen[best+1] = seq[i];
    }

    /*writing the output*/
    out = fopen("scmax.out", "w");
    fprintf(out, "%d\n", maxLen);
    for(i = 1; i <= maxLen; i++)
        fprintf(out, "%d ", subseqLen[i]);
    fprintf(out, "\n");
    fclose(out);

    return 0;
}

int findBest(int value)
{
    int l, r, middle;
    l = 0;
    r = maxLen + 1;

    while(l + 1 < r)
    {
        middle = (r - l) / 2 + l;
        if(subseqLen[middle] < value)
            l = middle;
        else
            r = middle;
    }

    return l;
}