Cod sursa(job #1379896)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 6 martie 2015 20:10:13
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#include <algorithm>
#include <vector>

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

#define Nmax 100010

#define val first
#define poz second

using namespace std;

int n , i , sol , F , crt , ant;

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

int aib[Nmax];

bool ap[Nmax];

vector < int > v;
vector < int > :: iterator it;

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

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

    for (i = x; i >= 1; i -= ub(i))
      sol = max(sol , aib[i]);

    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]);
        v.push_back(a[i]);
        copie[i] = a[i];
    }

    sort(v.begin() , v.end());
    it = unique(v.begin() , v.end());
    v.resize(distance(v.begin() , it));

    for (i = 1; i <= n; ++i)
        a[i] = lower_bound(v.begin() , v.end() , a[i]) - v.begin() + 1;


    for (i = 1; i <= n; ++i)
    {
       best[i] = inter(a[i]-1) + 1;

       update(a[i] , best[i]);
    }

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


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

    SOL[++SOL[0]] = copie[F];

   for (i = F; i ; --i)
    if (best[i] == best[F]-1 && a[i] < a[F])
   {
       SOL[++SOL[0]] = copie[i];
       F = i;
   }

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





    return 0;
}