Cod sursa(job #919048)

Utilizator tsubyRazvan Idomir tsuby Data 19 martie 2013 12:41:08
Problema Cel mai lung subsir comun Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#include <algorithm>
#define N 100001

using namespace std;

int a[N], b[N], c[N], n, lg;

void prelucrare()
{
    for (int i = 0; i < n; i++)
    {
        int pos = upper_bound(b, b + lg, a[i]) - b;
        if (pos >= 0 && pos < lg)
        {
            if (b[pos - 1] == a[i])
                continue;
            b[pos] = a[i];
            c[i] = pos;
        }
        else
        {
            if (b[lg - 1] == a[i])
                continue;
            b[lg ++] = a[i];
            c[i] = lg - 1;
        }
    }
}

void print(int i)
{
    if (i < 0 || lg < 0)
        return;
    while (i >= 0)
    {
        if (c[i] == lg)
        {
            lg--;
            print(i - 1);
            printf("%d ", a[i]);
            return;
        }
        i--;
    }
}

void read()
{
    scanf ("%d", &n);
    for (int i = 0; i < n; i++)
        scanf ("%d", &a[i]);
}

int main()
{
    freopen("cmlsc.in", "r", stdin);
    freopen("cmlsc.out", "w", stdout);
    read();
    prelucrare();
    lg--;
    printf("%d\n", lg+1);
    print(n - 1);

    return 0;
}