Cod sursa(job #1346721)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 18 februarie 2015 16:16:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>

using namespace std;

#define MAX_N 100001

int n;
int aib[MAX_N];

inline int lsb(int x) {
    return x & -x;
}

void update(int pos, int val) {
    for(; pos <= n; pos += lsb(pos))
        aib[pos] += val;
}

int query(int pos) {
    int s = 0;
    for(; pos; pos -= lsb(pos))
        s += aib[pos];
    return s;
}

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