Cod sursa(job #1866800)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 3 februarie 2017 15:48:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>

using namespace std;

int aib[100005], n;

int zeros(int x) {
    return x & -x;
}

int add(int poz, int x) {
    for(int i = poz; i <= n; i += zeros(i)) {
        aib[i] += x;
    }
}

int compute(int poz) {
    int sum = 0;
    for(int i = poz; i >= 1; i -= zeros(i)) {
        sum += aib[i];
    }
    return sum;
}

int cautbin(int val, int st, int dr) {
    int med, aux, last = -1;
    while(st <= dr) {
        med = (st + dr) / 2;
        aux = compute(med);
        if(aux == val) {
            last = med;
            dr = med - 1;
        } else
        if(aux < val) {
            st = med + 1;
        } else {
            dr = med - 1;
        }
    }
    return last;
}

int main() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    int m, x, y, tip;
    scanf("%d%d", &n, &m);

    for(int i = 1; i <= n; ++ i) {
        scanf("%d", &x);
        add(i, x);
    }

    for(int i = 1; i <= m; ++ i) {
        scanf("%d", &tip);
        scanf("%d", &x);
        if(tip == 0) {
            scanf("%d", &y);
            add(x, y);
        }
        if(tip == 1) {
            scanf("%d", &y);
            printf("%d\n", compute(y) - compute(x - 1));
        }
        if(tip == 2) {
            printf("%d\n", cautbin(x, 1, n));
        }
    }

    return 0;
}