Cod sursa(job #1452147)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 20 iunie 2015 00:41:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 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 sum(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;
}