Cod sursa(job #794928)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 7 octombrie 2012 13:11:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>

#define LGMAX 100003

using namespace std;

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

int n;
int length;
int a[LGMAX];
int s[LGMAX];
int lg[LGMAX];
int prev[LGMAX];

void read()
{
    fscanf (inFile, "%d\n", &n);

    for (int i = 1; i <= n; ++i)
        fscanf (inFile, "%d ", &a[i]);
}

int search(int x)
{
    int left = 0;
    int right = length;

    while (left <= right)
    {
        int mid = left + ((right - left) >> 1);

        if (a[s[mid]] < x && a[s[mid + 1]] >= x)
            return mid;
        else
            if (a[s[mid + 1]] < x)
                left = mid + 1;
            else
                right = mid - 1;
    }

    return length;
}

int solve()
{
    lg[1] = s[1] = length = 1;

    for (int i = 2; i <= n; ++ i)
    {
        int pos = search (a[i]);
        prev[i] = s[pos];
        lg[i] = pos + 1;
        s[pos + 1] = i;

        if (length < pos + 1)
            length = pos + 1;
    }

    for (int i = n; i >= 1; -- i)
        if (lg[i] == length)
            return i;

    return 0;
}

void print(int i)
{
    if (prev[i] > 0)
        print (prev[i]);

    fprintf (outFile, "%d ", a[i]);
}

int main()
{
    read();
    int aux = solve();

    fprintf (outFile, "%d\n", length);
    print(aux);

    return 0;
}