Cod sursa(job #764885)

Utilizator igsifvevc avb igsi Data 6 iulie 2012 16:56:27
Problema Subsir crescator maximal Scor 95
Compilator c Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>

int subseqLen[100001][2], seq[100001], predecessor[100001], N, maxLen, maxPos;
FILE *in, *out;

void printSeq(int k)
{
    if(predecessor[k])
        printSeq(predecessor[k]);
    fprintf(out, "%d ", seq[k]);    
}

int main()
{
    int i, best, l, r, middle;

    /*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++)
    {
        l = 0;
        r = maxLen + 1;
        while(l + 1 < r)
        {
            middle = (r - l) / 2 + l;
            if(subseqLen[middle][0] < seq[i])
                l = middle;
            else
                r = middle;
        }       
        best = l;

        predecessor[i] = subseqLen[best][1];
        if(best == maxLen)
        {
            subseqLen[++maxLen][0] = seq[i];
            subseqLen[maxLen][1] = i;
            maxPos = i;
        }
        else if(subseqLen[++best][0] > seq[i])
        {
            subseqLen[best][0] = seq[i];
            subseqLen[best][1] = i;
        }
    }

    /*writing the output*/
    out = fopen("scmax.out", "w");
    fprintf(out, "%d\n", maxLen);
    printSeq( maxPos );
    fprintf(out, "\n");

    fclose(out);

    return 0;
}