Cod sursa(job #1092682)

Utilizator matei_cChristescu Matei matei_c Data 27 ianuarie 2014 12:24:56
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<cstdio>
#include<algorithm>
using namespace std ;

#define maxn 100001

int N, M ;

int aib[maxn] ;

bool sel[maxn] ;

void update(int ind, int val)
{
    while( ind <= N )
    {
        aib[ind] += val ;
        ind += ( ind & ( -ind ) ) ;
    }
}

int suma(int ind)
{
    int x = 0 ;

    while( ind )
    {
        x += aib[ind] ;
        ind -= ( ind & (-ind) ) ;
    }

    return x ;
}

int query(int val)
{
    if( aib[1] > val )
        return -1 ;

    int ind = 1 ;
    int ad = N - 1 ;

    while( ad )
    {
        int V = suma(ind + ad) ;

        if( V == val )
            return ind + ad ;

        if( V < val )
            ind += ad ;

        ad >>= 1 ;
    }

    if( suma(ind) == val )
        return ind ;

    return -1 ;
}

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

    scanf("%d%d", &N, &M);

    for(int i = 1; i <= N; ++i )
    {
        int x ;
        scanf("%d", &x);
        update( i, x ) ;
    }

    for(int i = 1; i <= M; ++i )
    {
        int op ;
        scanf("%d", &op);

        if( op == 0 )
        {
            int a, b ;
            scanf("%d%d", &a, &b);
            update( a, b ) ;
        }

        if( op == 1 )
        {
            int a, b ;
            scanf("%d%d", &a, &b);
            printf("%d\n", suma(b) - suma(a - 1));
        }

        if( op == 2 )
        {
            int a ;
            scanf("%d", &a);
            printf("%d\n", query(a));
        }
    }

    return 0 ;
}