Cod sursa(job #2195965)

Utilizator Constantin.Dragancea Constantin Constantin. Data 17 aprilie 2018 21:26:36
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
using namespace std;

int a[100010], n, m;

void update(int i, int val){
    while (i <= n){
        a[i] += val;
        i += (i & -i);
    }
}

int query(int idx){
    int rs = 0;
    while (idx > 0){
        rs += a[idx];
        idx -= (idx & -idx);
    }
    return rs;
}

int main(){
    ifstream cin ("aib.in");
    ofstream cout ("aib.out");
    cin >> n >> m;
    for (int i=1, x; i<=n; i++) cin >> x, update(i, x);
    for (int i=1, o, x, y; i<=m; i++){
        cin >> o >> x;
        if (o == 2){
            int st = 1, dr = n;
            while (st <= dr){
                int mid = (st + dr) >> 1;
                if (query(mid) < x) st = mid + 1;
                else dr = mid - 1;
            }
            if (query(st) == x) cout << st << "\n";
            else cout << "-1\n";
            continue;
        }
        cin >> y;
        if (!o) update(x, y);
        else if (o == 1) cout << query(y) - query(x-1) << "\n";
    }
    return 0;
}