Cod sursa(job #174882)

Utilizator DastasIonescu Vlad Dastas Data 9 aprilie 2008 12:29:50
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>

const int maxn = 100001;
const int inf = 2000000002;

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

int n;
int a[maxn];


int p[maxn];
int l;
int q[maxn];

int st[maxn];

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

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

int binsearch(int st, int dr, int what)
{
    int m = 0;

    while ( st < dr )
    {
        m = (st + dr) >> 1;

        if ( q[m] >= what )
            dr = m;
        else
            st = m + 1;
    }

    return st;
}

void go()
{
    int k = 0;

    for ( int i = 1; i <= n; ++i )
    {
        k = binsearch(1, l+1, a[i]);

        if ( q[k] == inf )
            ++l;

        q[k] = a[i];
        p[i] = k;
    }

    fprintf(out, "%d\n", l);

    k = 0;
    for ( int i = n; i; --i )
        if ( p[i] == l )
            st[++k] = a[i], --l;

    for ( int i = k; i; --i )
        fprintf(out, "%d ", st[i]);
}

int main()
{
    read();
    go();


    return 0;
}