Cod sursa(job #1765286)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 26 septembrie 2016 16:11:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int aib[100005];

void update(int a, int b, int n){
    for(;a <= n;a += a&(-a)){
        aib[a] += b;
    }
}

int query(int a){
    int ans = 0;
    for(;a;a -= a&(-a)){
        ans += aib[a];
    }
    return ans;
}

int binarySearch(int lf, int rg, int x){
    int i,step;
    for(step = 1;step <= rg;step <<= 1);
    for(i = lf-1;step;step >>= 1){
        if(i + step <= rg && query(i + step) <= x){
            i += step;
        }
    }
    if(query(i) == x && i != 0){
        return i;
    }
    return -1;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    int n,m,op,a,b,i;
    scanf("%d %d", &n, &m);
    for(i = 1;i <= n;i++){
        scanf("%d", &a);
        update(i, a, n);
    }
    for(i = 1;i <= m;i++){
        scanf("%d", &op);
        if(op == 0){
            scanf("%d %d", &a, &b);
            update(a, b, n);
        }else if(op == 1){
            scanf("%d %d", &a, &b);
            printf("%d\n", query(b) - query(a-1));
        }else{
            scanf("%d", &a);
            printf("%d\n", binarySearch(1, n, a));
        }
    }
    return 0;
}