Cod sursa(job #1379789)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 6 martie 2015 19:28:17
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <algorithm>

#define ub(x) (x&(-x))

#define Nmax 100010

#define val first
#define poz second

using namespace std;

int n , i , sol , F , crt;

int best[Nmax] , copie[Nmax] , start[Nmax] , SOL[Nmax];

pair < int , int > aib[Nmax] , a[Nmax];

void update(int x , int b)
{
    for (int i = x; i <= n; i += ub(i))
        if (aib[i].val < b)
            aib[i].val = b , aib[i].poz = x;
}

int inter(int x , int &inceput)
{
    int i , sol = 0;

    for (i = x; i >= 1; i -= ub(i))
     if (sol < aib[i].val)
         sol = aib[i].val , inceput = aib[i].poz;

    return sol;
}

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

    scanf("%d", &n);
    for (i=1;i<=n;i++)
    {
        scanf("%d", &a[i].val);
        a[i].poz = i;
        copie[i] = a[i].val;
    }

    sort(a + 1 , a + n + 1);

    for (i = 1; i <= n; ++i)
    if (a[i].val != a[i-1].val)
    {
        best[i] = inter(a[i].poz - 1 , start[i]) + 1;

        update(a[i].poz , best[i]);

    }
    else copie[a[i].poz] = -1;

    for (i = 1; i <= n; ++i)
     if (sol < best[i])
            sol = best[i] , F = a[i].poz;

    printf("%d\n", sol);

    crt = 0;

    for (i = F; crt < sol; --i)
     if (copie[i] != -1)
     {
         SOL[++SOL[0]] = copie[i];
         crt++;
     }

    for (i = SOL[0]; i >= 1; --i)
         printf("%d ", SOL[i]);


    return 0;
}