Cod sursa(job #1780872)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 16 octombrie 2016 16:30:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#define min(x,y) (x<y?x:y)

using namespace std;

int v[100000], a[100000], b[100000], n, lgb = 1, r[100000], lr = 0;

int main()
{
    int i, j, ok;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    scanf("%d", &v[0]);
    b[0] = 0; a[0] = -1;
    for(i = 1; i < n; i++)
    {
        scanf("%d", &v[i]);
        a[i] = -1;
        if(v[i] < v[b[0]])
            b[0] = i;
        for(j = lgb - 1; j >= 0; j--)
        {
            if(v[i] > v[b[j]])
            {
                a[i] = b[j];
                if(j + 1 < lgb && v[b[j + 1]] > v[i])
                {
                    b[j + 1] = i;
                }
                else if(j + 1 == lgb)
                {
                    b[j + 1] = i;
                    lgb++;
                }
                break;
            }
        }
    }
    printf("%d\n", lgb);
    for(i = b[lgb - 1]; a[i] != -1; i = a[i])
        r[lr++] = v[i];
    r[lr++] = v[i];
    for(i = lr - 1; i >= 0; i--)
        printf("%d ", r[i]);
    return 0;
}