Cod sursa(job #1452150)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 20 iunie 2015 01:33:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.57 kb
#include <bits/stdc++.h>
 
using namespace std;
 
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
 
template<typename Int>
class FenwickTree {
 
public:
    FenwickTree() {}
 
    FenwickTree(int n) {
        this->n = n;
        bit.resize(n + 5);
 
        int lim = 1;
        while (lim <= n)
            lim *= 2;
 
        this->lim = lim;
    }
 
    template<typename Array>
    FenwickTree(int n, Array& v) {
        this->n = n;
        bit.resize(n + 5);
        build(n, v);
 
        int lim = 1;
        while (lim <= n)
            lim *= 2;
 
        this->lim = lim;
    }
 
    void update(int poz, Int &val) {
        return update(n, poz, val);
    }
 
    Int sum(int left, int right) {
        return summ(n, right) - summ(n, left - 1);
    }
 
    Int sum(int poz) {
        return summ(n, poz);
    }
 
    int query(Int& val) {
        return query(n, val);
    }
 
private:
    vector<Int> bit;
    int n, lim;
 
    void update(int n, int poz, Int& val) {
        for (int i = poz; i <= n; i += i & (-i))
            bit[i] += val;
    }
 
    Int summ(int n, int poz) {
        Int r = 0;
 
        for (int i = poz; i; i -= i & (-i))
            r += bit[i];
 
        return r;
    }
 
    int query(int n, Int& x) {
        int poz = 0;
        Int y = x;
 
        for (int step = lim; step; step /= 2)
            if (poz + step < n && bit[poz + step] < x) {
                x -= bit[poz + step];
                poz += step;
            }
 
        return (summ(n, poz + 1) == y) ? poz + 1 : -1;
    }
 
    template<typename Array>
    void build(int n, Array& v) {
        for (int i = 1; i <= n; i++)
            update(i, v[i]);
    }
 
};
 
FenwickTree<int> myTree;
 
int main() {
 
    cin.sync_with_stdio(false);
 
#ifndef ONLINE_JUDGE
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
#endif
 
    int n, q;
    cin >> n >> q;
 
    myTree = FenwickTree<int>(n); 
 
    for (int i = 1; i <= n; i++) {
        int val;
        cin >> val;
        myTree.update(i, val);
    }
 
    for (; q; q--) {
        int op;
        cin >> op;
 
        if (op == 0) {
            int poz, val;
            cin >> poz >> val;
            myTree.update(poz, val);
 
        } else if (op == 1) {
            int a, b;
            cin >> a >> b;
            printf("%d\n", myTree.sum(a, b));
 
        } else {
            int val;
            cin >> val;
            printf("%d\n", myTree.query(val));
        }
    }
 
    return 0;
}