Cod sursa(job #792776)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 29 septembrie 2012 22:04:16
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>

#define LGMAX 100003

using namespace std;

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

int n;
int a[LGMAX];
int res[LGMAX];

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

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

void solve()
{
    res[0] = res[1] = 1;

    for (int i = 2; i <= n; ++i)
    {
        int left = 1;
        int right = res[0];

        while (left <= right)
        {
            int mid = ((right - left) >> 1) + left;
            if (a[i] > a[res[mid]])
                left = mid + 1;
            else
                right = mid - 1;
        }

        if (left > res[0])
            ++res[0];
        res[left] = i;
    }
}

void print()
{
    fprintf (outFile, "%d\n", res[0]);

    for (int i = 1; i <= res[0]; ++i)
        fprintf (outFile, "%d ", a[res[i]]);
}

int main()
{
    read();
    solve();
    print();

    return 0;
}