Cod sursa(job #1466765)

Utilizator mariakKapros Maria mariak Data 30 iulie 2015 11:29:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <algorithm>
#define Dim 100003

using namespace std;
int n, v[Dim], i, j, poz, nr, best[Dim], maxx, sol[Dim], L[Dim];
void write(int i)
{
    if(sol[i] > 0)
        write(sol[i]);
    printf("%d ", v[i]);
}
void read()
{
    scanf("%d", &n);
    for(i = 1; i <= n; ++ i)
        scanf("%d", &v[i]);
}
int bsearch(int x)
{
    int st = 0, dr = nr, m = (st + dr) / 2;
    while(st <= dr)
    {
        if(v[L[m]] < x && v[L[m + 1]] >= x)
            return m;
        else if(v[L[m]] < x)
            st = m + 1, m = (st + dr) / 2;
        else
            dr = m - 1, m = (st + dr) / 2;
    }
    return nr;
}
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    read();
    best[1] = L[1] = 1;
    L[0] = 0;
    nr = 1;
    for(i = 2; i <= n; ++ i)
    {
        poz = bsearch(v[i]);
        best[i] = poz + 1;
        L[poz + 1] = i;
        sol[i] = L[poz];
        if(nr < poz + 1)
            nr = poz + 1;
    }
    maxx = 0;
    poz = 0;
    for(i = 1; i <= n; ++ i)
    {
        if(maxx < best[i])
        {
            maxx = best[i];
            poz = i;
        }
    }
    printf("%d\n", maxx);
    write(poz);

    return 0;
}