Cod sursa(job #1224553)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 31 august 2014 12:49:02
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 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]=a[i];
    }

}

int f(int x,int st,int dr)
{
    //cautsre binara in srted

    int mid=(st+dr)/2;
    if(x==srted[mid])
        return mid;
    else if(x>srted[mid])
        f(x, mid+1, dr);
    else if(x<srted[mid])
        f(x, st, mid);
}

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);
    }

    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;
}