Cod sursa(job #730576)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 6 aprilie 2012 15:58:00
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>
#include <algorithm>

#define f(x) ((x^(x - 1)) & x)

using namespace std;

const int MAX = 100050;
int n, v[MAX], nrm[MAX], res[MAX], up[MAX], aib[MAX], d[MAX], maxim, indice;

int query(int x)
{
    int mx = 0;
    for(;x; x -= f(x))
        if(d[aib[x]] > d[mx])
            mx = aib[x];
    return mx;
}

void update(int x, int poz)
{
    for(;x <= n; x += f(x))
        if(d[poz] > d[aib[x]])
            aib[x] = poz;
}

void afisare(int i)
{
    if(!i)
    {
        return;
    }
    afisare(up[i]);
    printf("%d ", res[i]);
}

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

    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i]);
        nrm[i] = res[i] = v[i];
    }
    sort(nrm + 1, nrm + n + 1);
    int h = 1;
    for(int i = 2; i <= n; i++)
        if(nrm[i] != nrm[h])
            nrm[++h] = nrm[i];
    for(int i = 1; i <= n; i++)
        v[i] = lower_bound(nrm + 1, nrm + h + 1, v[i]) - nrm;
    for(int i = 1; i <= n; i++)
    {
        up[i] = query(v[i] - 1);
        d[i] = d[up[i]] + 1;
        update(v[i], i);
        if(d[i] > maxim)
        {
            maxim = d[i];
            indice = i;
        }
    }
    printf("%d\n", maxim);
    afisare(indice);

    fclose(stdin);
    fclose(stdout);
    return 0;
}