Cod sursa(job #1180921)

Utilizator dropsdrop source drops Data 1 mai 2014 13:35:01
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MAX 100001

int a[MAX], n, m;

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

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

int caut(int x) {
    int l = 1, r = n, m;
    while (r-l > 1) {
        m = (l + r) / 2;
        if (query(m) >= x) r = m; else l = m;
    }
    return query(l) == x ? l : query(r) == x ? r : -1;
}

int main()
{
    int op, a, b;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> b;
        update(i, b);
    }
    for (int i = 1; i <= m; i++) {
        cin >> op;
        if (op == 0) {
            cin >> a >> b;
            update(a, b);
        } else
        if (op == 1) {
            cin >> a >> b;
            cout << query(b) - query(a-1) << "\n";
        } else {
            cin >> a;
            cout << caut(a) << "\n";
        }
    }

    return 0;
}