Cod sursa(job #739286)

Utilizator veleanduAlex Velea veleandu Data 22 aprilie 2012 17:12:37
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <cstdio>
using namespace std;
#define maxn 100005

    long AI[2*maxn];
    long n,m,i,j,op,a,b,nr;
    long rez,mij;

void aib_push ( long ind, long val, long st, long dr, long nod )
{
    AI[nod]+=val;
    mij= ( st+dr)/2;
    if ( st==dr )
        return ;
    else{
        if ( mij >= ind )
            return aib_push( ind, val, st, mij, 2*nod );
        else
            return aib_push ( ind, val , mij+1, dr , 2*nod+1 );
    }
}

long aib_query ( long c1, long c2, long st, long dr, long nod )
{
    long m;
    m=(st+dr)/2;
    if ( st==c1 && dr==c2 )
        return AI[nod];
    if ( m >= c2 )
        return aib_query ( c1,c2,st,m,2*nod );
    if ( m<c1 )
        return aib_query ( c1,c2,m+1,dr,2*nod+1);
    return  aib_query ( c1,m,st,m,2*nod) + aib_query ( m+1,c2,m+1,dr,2*nod+1 );
}

long aib_search ( long val , long st, long dr, long nod )
{
    //printf (" val: %d st: %d dr: %d nod: %d AI: %d \n",val,st,dr,nod,AI[nod]);
    if ( st > dr )
        return -1 ;
    mij=(st+dr)/2;
    if ( rez + AI[nod] == val )
        return dr;
    if ( rez + AI[2*nod] < val )
    {
        rez+=AI[2*nod];
        return aib_search ( val,mij+1,dr,2*nod+1 );
    }
    else
        return aib_search ( val,st,mij,2*nod );
}


int main()
{
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);
    scanf ("%d %d",&n,&m);
    for ( i=1; i<=n; i++ )
    {
        scanf ("%d",&a);
        aib_push ( i,a,1,n,1 );
    }
    for ( i=1; i<=m; i++ )
    {
        scanf ("%d",&op );
        if ( op == 0 )
        {
            scanf ( "%d %d",&a,&b );
            aib_push ( a,b,1,n,1 );
        }
        if ( op == 1 )
        {
            scanf ( "%d %d",&a,&b );
            nr=aib_query ( a,b,1,n,1 );
            printf ( "%d\n", nr );
        }
        if ( op == 2 )
        {
            scanf ( "%d",&a);
            rez=0;
            nr=aib_search ( a,1,n,1 );
            //if ( rez == a )
                printf ( "%d\n", nr );
            /*else
                printf ( "-1\n" );*/
        }
    }
    return 0;
}