Cod sursa(job #486975)

Utilizator ariel_roAriel Chelsau ariel_ro Data 23 septembrie 2010 14:25:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <stdlib.h>
#include <fstream>

#define NMAX 100005

using namespace std;

int v[NMAX], b[NMAX], p[NMAX], L = 1, N;

FILE *in = fopen("scmax.in", "r");
FILE *out = fopen("scmax.out", "w");

void solve()
{
    int start, stop, mij;
    b[1] = 1;
    for (int i = 2; i <= N; i++)
    {
        if (v[i] > v[b[L]])
        {
            p[i] = b[L];
            b[++L] = i;
            continue;
        }

        start = 1, stop = L;
        // gasirea max-ului prin d.e.i.
        while (start < stop)
        {
            mij = (start + stop) / 2;
            if (v[i] > v[b[mij]])
                start = mij + 1;
            else
                stop = mij;
        }

        int j = start - 1; // j -> v[i] > v[b[j]]
        p[i] = b[j];
        if (j == L || v[i] < v[b[j + 1]])
        {
            b[j + 1] = i;
            L = max(L, j + 1);
        }
    }

    fprintf(out, "%d\n", L);
}

void constructSol(int i)
{
   if (p[i] > 0)  constructSol(p[i]);
   fprintf(out, "%d ", v[i]);
}

int main()
{
    fscanf(in, "%d", &N);
    for (int i = 1; i <= N; i++)
        fscanf(in, "%d", &v[i]);

    solve();
    constructSol(b[L]);
    return 0;
}