Cod sursa(job #2182742)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 22 martie 2018 16:59:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
using namespace std;
long long aib[100005] , sp[100005];
int n;
void update(int poz , int val) {
    for( ; poz <= n ; poz = poz + (poz&-poz))
        aib[poz] += val;
}
long long query(int poz) {
    long long s = 0;
    for( ; poz > 0 ; poz = poz - (poz&-poz))
        s = s + aib[poz];
    return s;
}
int bs(int n , int a) {
    int st , dr , med;
    st = 1;
    dr = n;
    while(st <= dr) {
        med = (st + dr) / 2;
        if(query(med) == a)
            return med;
        else if(query(med) > a)
            dr = med - 1;
        else
            st = med + 1;
    }
    return -1;
}
int main() {
    freopen("aib.in" , "r" , stdin);
    freopen("aib.out" , "w" , stdout);
    int m , a , b , i , op , poz , x;
    scanf("%d%d" , &n , &m);
    for(i = 1 ; i <= n ; i ++) {
        scanf("%d" , &x);
        sp[i] = sp[i - 1] + x;
    }
    for(i = 1 ; i <= n ; i ++)
        aib[i] = sp[i] - sp[i - (i&-i)];
    for(i = 1 ; i <= m ; i ++) {
        scanf("%d" , &op);
        if(op == 0) {
            scanf("%d%d" , &a , &b);
            update(a , b);
        } else if(op == 1) {
            scanf("%d%d" , &a , &b);
            printf("%lld\n" , query(b) - query(a - 1));
        } else if(op == 2) {
            scanf("%d" , &a);
            poz = bs(n , a);
            printf("%d\n" , poz);
        }
    }
    return 0;
}