Cod sursa(job #503774)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 24 noiembrie 2010 21:35:21
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

int a[263000],p[263000],v[100001],v2[100001],ind[100001],n,aux,c,x=1;

int cmp(int i,int j)
{
    return v[i]<v[j];
}

int maxx(int i,int j)
{
    if (i>=j) return i;
    return j;
}

int query(int nod,int s,int d,int l,int r)
{
    if ((d<l)||(s>r)) return 0;
    if ((l<=s)&&(d<=r)) return a[nod];
    int a,b;
    a=query(2*nod,s,(s+d)/2,l,r);
    b=query(2*nod+1,(s+d)/2+1,d,l,r);
    return maxx(a,b);
}

int main()
{
    int i,j;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;++i)
    {
        scanf("%d",&v2[i]);
        v[i]=v2[i];
        ind[i]=i;
    }
    sort(ind+1,ind+n+1,cmp);
    i=1;
    while (i<=n)
    {
        aux=i;
        while ((i<=n)&&(v[ind[i]]==v[ind[i+1]])) ++i;
        ++c;
        for (j=aux;j<=i;++j) v[ind[j]]=c;
        ++i;
    }
    while (x<c) x*=2;
    for (i=1;i<=n;++i)
    {
        aux=query(1,1,x,1,v[i]-1);
        a[x-1+v[i]]=aux+1;
        for (j=(x-1+v[i])/2;j>0;j/=2)
            a[j]=maxx(a[2*j],a[2*j+1]);
    }
    printf("%d",a[1]);
    return 0;
}