Cod sursa(job #1004168)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 2 octombrie 2013 11:00:10
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#define Nmax 100001

using namespace std;

int N, M, aib[Nmax];

void update(int idx, int val){

    while(idx <= N){
        aib[idx] += val;
        idx += (idx & -idx);
    }

}

int query(int idx){

    int sum = 0;

    while(idx > 0){
        sum += aib[idx];
        idx -= (idx & -idx);
    }

    return sum;
}

int search(int val){

    int p = 1;
    int u = N;

    while( p <= u){
        int mid = (p + u)/2;

        int sum = query(mid);

        if(sum == val)
            return mid;

        if(sum > val)
            u = mid - 1;

        else
            p = mid + 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 x;
        scanf("%d", &x);
        update(i, x);
    }


    for(int i = 1; i <= M; ++i){

        int t, a, b;

        scanf("%d", &t);

        switch(t){

            case 0:
                scanf("%d%d", &a, &b);
                update(a, b);
                break;

            case 1:{
                scanf("%d%d", &a, &b);
                int sA = query(a -1);
                int sB = query(b);
                printf("%d\n", sB - sA);
                break;
            }

            case 2:
                scanf("%d", &a);
                printf("%d\n", search(a));

            break;

            
                
        }


    }


    return 0;
}