Cod sursa(job #1478272)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 28 august 2015 12:42:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>

using namespace std;
const char iname[] = "aib.in";
const char oname[] = "aib.out";
const char eval[]  = "E:/Downloads/grader_test2 (1).ok";
const int MAXN = 100005;
void check();
int n, m, tree[MAXN];

void add(int index, int val){
    while(index <= n){
        tree[index] += val;
        index += (index & (-index));
    }
}

int getSum(int index){
    int sum = 0;
    while(index > 0){
        sum += tree[index];
        index -= (index & (-index));
    }
    return sum;
}

void read(){
    freopen(iname, "r", stdin);
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++i){
        int aux;
        scanf("%d", &aux);
        add(i, aux);
    }
}
int find(int val){
    if(val == 0) return -1;
    int index = 0;
    int bitmask = 1;
    while(bitmask <= n) bitmask <<= 1;
    bitmask >>=1;
    while((bitmask) && (index < n)){
        int tIndex = index + bitmask;
        if(tIndex <= n){
        if(val == tree[tIndex]) {
                if(tIndex == 0){
                    printf("%d\n", val);
                }
                return tIndex;
        }
        else if(val > tree[tIndex]){
            index += bitmask;
            val -= tree[tIndex];
        }}
        bitmask >>=1;
    }
    if(val != 0)
        return -1;
    else
        return index;
}
void solve(){
    FILE *out = fopen(oname, "w");
    for(int i = 0; i < m; ++i){
        int c, a, b;
        scanf("%d", &c);
        if(c == 2){
                scanf("%d", &a);
                fprintf(out,"%d\n", find(a));
        }
        else{
            scanf("%d %d", &a, &b);
            if(c == 0) add(a, b);
            if(c == 1) {
                    fprintf(out,"%d\n", getSum(b) - getSum(a-1));
            }
        }
    }
}
int main()
{
    read();
    solve();
    return 0;
}