Cod sursa(job #1147590)

Utilizator gbi250Gabriela Moldovan gbi250 Data 19 martie 2014 23:01:15
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#define zeros(x) ( (x ^ (x-1) ) & x )
#define SIZE 100002
using namespace std;

int n, m, v[SIZE];

inline void add(int pos, int value)
{
    for(int i = pos; i <= n; i += zeros(i))
        v[ i ] += value;
}

inline int query(int pos)
{
    int sum = 0;
    for(int i = pos; i >= 1; i -= zeros(i) )
        sum += v[i];
    return sum;
}

inline int search_val( int value )
{
    int left = 1, right = n;

    while( left <= right )
    {
        int middle = ( left + right ) >> 1;
        int value_tmp = query( middle );

        if( value_tmp == value )
            return middle;
        else if( value_tmp > value )
            right = middle - 1;
        else
            left = middle + 1;
    }
    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 value;
        scanf("%d", &value);
        add(i, value);
    }

    while( m-- )
    {
        int op;
        scanf("%d", &op);
        if( op < 2 )
        {
            int a, b;
            scanf("%d%d", &a, &b);
            if( !op )
                add( a, b );
            else
                printf( "%d\n", query( b ) - query( a- 1 ) );
        }
        else
        {
            int value;
            scanf("%d", &value);
            printf("%d\n", search_val( value ) );
        }
    }

    return 0;
}