Cod sursa(job #1082942)

Utilizator heracleRadu Muntean heracle Data 15 ianuarie 2014 12:14:20
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <algorithm>

const int Q=100000;


int n,v[Q+1],w[Q+1],x[Q+1];

bool cmp(int x, int y)
{
    return v[x]<v[y];
}

int arb[Q+1];
bool fact[Q+1];

int que(int x)
{
    int rez=0;
    while(x)
    {
        rez+=arb[x];
        x-=x & (-x);
    }
    return rez;
}

void add(int x)
{
    if(fact[x]==1)
        return;
    fact[x]=1;
    int i=x;
    while(i<=n)
    {
        arb[i] ++;
        i += i &(-i);
    }
}

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

    scanf("%d",&n);

    //int x;

    for(int i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);
        w[i]=i;
    }

    std::sort(w+1,w+n+1,cmp);

    for(int i=1; i<=n; i++)
    {
        if( v[w[i]] == v[w[i-1]] )
        {
            //printf("?");
            x[w[i]]=x[w[i-1]];
        }

        else
            x[w[i]]=i;
    }

    int max=0,act;

    for(int i=1; i<=n; i++)
    {
        act=que(x[i]-1);
        if(act+1>max)
            max=act+1;
        add(x[i]);
    }

    printf("%d",max);
    return 0;
}