Cod sursa(job #2020938)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 12 septembrie 2017 11:51:21
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#define MAX 100005
#define z(x) (x & (-x))

int n, m, t, x, y;
int v[MAX], a[MAX];

void u(int p, int v){
    for(int i = p; i <= n; i += z(i))
        a[i] += v;
}

int q(int x){
    int s = 0;
    while(x){
        s += a[x];
        x -= z(x);
    }
    return s;
}

int cb(int s){
    int l = 1, r = n;
    while(l <= r){
        int m = (l + r) / 2;
        int v = q(m);
        if(v == s)
            return m;
        v < s ?  (l = m + 1) : (r = m - 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){
        scanf("%d", &v[i]);
        u(i, v[i]);
    }

    for(int i = 0; i < m; ++i){
        scanf("%d%d", &t, &x);
        if(t == 0){
            scanf("%d", &y);
            u(x, y);
        }
        else if(t == 1){
            scanf("%d", &y);
            printf("%d\n", q(y) - q(x - 1));
        }
        else
            printf("%d\n", cb(x));
    }
    return 0;
}