Cod sursa(job #1224559)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 31 august 2014 12:58:49
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <vector>
#include <fstream>
#include <algorithm>

#define last2(a) ((a^(a-1))+1)>>1
#define dmax 100001

using namespace std;

int a[dmax], sol[dmax], n, poz[dmax], s;
int srted[dmax], rff[dmax], ht[dmax], aib[dmax];
int na;

int query(int x)
{
    int maxx=0;
    while(x>0)
    {
        if(maxx<aib[x])
            maxx=aib[x];
        x-=last2(x);
    }
    return maxx;
}

void update(int p, int v)
{
    while(p<=na)
    {
        if(v>aib[p])
            aib[p]=v;
        p+=last2(p);
    }
}

void read()
{
    //ifstream fin("scmax.in");
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    scanf("%i", &n);
    //fin>>n;
    for(int i=1; i<=n; i++)
    {
        //fin>>a[i];
        scanf("%i", &a[i]);
        srted[i]=rff[i]=a[i];
    }

}


void solve()
{
    sort(srted+1, srted+n+1);

    int h=1;
    for(int i=2; i<=n; i++)
        if(srted[h]!=srted[i])
            srted[++h]=srted[i];
    na=h;
    for(int i=1; i<=n; i++)
    {
        //rff[i]=f(a[i], 1, na);
        rff[i]=lower_bound(srted+1, srted+na+1, rff[i])-srted;
    }

    for(int i=1; i<=n; i++)
    {
        ht[rff[i]]=query(rff[i]-1)+1;
        update(rff[i], ht[rff[i]]);
    }

}

void solutie(int k, int i)
{
    if(k>0)
    {
        while(ht[i]!=k)
            i--;
        solutie(k-1, i);

        printf("%i ", srted[i]);
    }
}

int main()
{
    read();

    solve();
    int sol=query(na);
    printf("%i\n", sol);

    //refacere solutie
    solutie(sol, na);

    return 0;
}