Cod sursa(job #1790569)

Utilizator antanaAntonia Boca antana Data 28 octombrie 2016 14:16:34
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <algorithm>
#define MAXN 100000

struct aa{
    int nr, id;
}aux[MAXN+1];

int n, d[MAXN+1], v[MAXN+1], aib[MAXN+1], p[MAXN+1], last[MAXN+1], name[MAXN+1];

bool cmp(const aa &v1, const aa &v2)
{
    if(v1.nr == v2.nr)
        return (v1.id > v2.id);
    return (v1.nr < v2.nr);
}

inline void update(int x, int pos, int val)
{
    int i = x;
    while(i<=n)
    {
        if(val > aib[i]){
            aib[i] = val;
            p[i] = pos;
        }
        i += (i&-i);
    }
}

inline int query(int ind)
{
    int m = 0, pos;
    while(ind > 0)
    {
        if(m < aib[ind]){
            m = aib[ind];
            pos = p[ind];
        }
        ind -= (ind & -ind);
    }
    return pos;
}

void scrie(int pos)
{
    if(last[pos] != 0)
        scrie(last[pos]);

    printf("%d ", name[v[pos]]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    int r, maxs=-1, pos, i;

    scanf("%d", &n);

    for(i=1; i<=n; ++i)
        scanf("%d", &aux[i].nr), aux[i].id = i;

    std::sort(aux+1, aux+n+1, cmp);

    for(i=1; i<=n; ++i){
        v[aux[i].id] = i;
        name[i] = aux[i].nr;
    }

    for(i=1; i<=n; ++i){
        r = query(v[i]-1);
        d[i] = d[r] + 1;
        last[i] = r;
        update(v[i], i, d[i]);
    }

    for(i=1; i<=n; ++i)
        if(d[i] > maxs)
            maxs = d[i], pos = i;

    printf("%d\n", maxs);
    scrie(pos);

    return 0;
}