Cod sursa(job #2891198)

Utilizator bubblegumixUdrea Robert bubblegumix Data 17 aprilie 2022 19:41:55
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.17 kb
#pragma region Template
#include <bits/stdc++.h>
using namespace std;

#define io                            \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);                    \
    cout.tie(NULL)
#define all(x) begin(x), end(x)
using ld = long double;
using ll = long long;
using ull = unsigned long long;
#pragma endregion Template

#pragma region Debug
#define sim template <class c
#define ris return *this
#define dor > debug& operator<<
#define eni(x) sim > typename enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef HOME
    ~debug() { /*cerr << endl;*/
    }
    eni(!= ) cerr << boolalpha << i;
    ris;
} eni(== ) ris << range(begin(i), end(i));
}
sim, class b dor(pair<b, c> d) {
    ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
    *this << "[";
    for (auto it = d.b; it != d.e; ++it)
        *this << ", " + 2 * (it == d.b) << *it;
    ris << "]";
}
#else
    sim dor(const c&) { ris; }
#endif
}
;
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
#define dbg(x)          \
    debug() << imie(x); \
    cerr << endl
#define drg(x, n)                                          \
    debug() << " [" << #x ": " << range(x, x + n) << "] "; \
    cerr << endl
#define darr(x)                                          \
    debug() << " [" << #x ": " << range(all(x)) << "] "; \
    cerr << endl
#define darr2D(x)                                  \
    size_t step = 0;                               \
    cerr << " [" << #x ": [";                      \
    for_each(all(x), [&step](const auto& it) { debug() << range(all(it)); if(step < sizeof(x) / sizeof(x[0])-1) cerr << ", "; ++step; }); \
    cerr << "]] " << endl
#define TwoD(x)                                    \
    size_t step = 0;                               \
    cerr << "[";                                   \
    for_each(all(x), [&step](const auto& it) { debug() << range(all(it)); if(step < sizeof(x) / sizeof(x[0])-1) cerr << ", "; ++step; }); \
    cerr << "]"
#define darr3D(x)                                    \
    size_t step1 = 0;                                \
    cerr << " [" << #x ": [";                        \
    for_each(all(x), [&step1](const auto& it1) { TwoD(it1); if(step1 < sizeof(x) / sizeof(x[0])-1) cerr << ", "; ++step1; }); \
    cerr << "]] " << endl
#pragma endregion Debug

vector<ll> build(vector<ll> v) {
    vector<ll> bit = v;
    for (int i = 0; i < (int)v.size(); i++) {
        int parent = i + (i & (-i));
        if (parent < (int)v.size()) {
            bit[parent] += bit[i];
        }
    }
    return bit;
}
ll sum(vector<ll>& bit, ll idx) {
    ll sum = 0;
    for (int i = idx; i; i -= (i & (-i)))
        sum += bit[i];
    return sum;
}
ll sum(vector<ll>& bit, ll L, ll R) { return sum(bit, R) - sum(bit, L - 1); }

void update(vector<ll>& bit, ll idx, ll val) {
    for (int i = idx; i <= (int)bit.size(); i += (i & (-i)))
        bit[i] += val;
}

int search(vector<ll>& bit, ll target) {
    int l = 1;
    int r = bit.size() - 1;
    int ans = -1;
    while (l <= r) {
        int mid = l + ((r - l) >> 1);
        if (sum(bit, mid) == target) {
            ans = mid;
            return ans;
        }
        else if (sum(bit, mid) > target) {
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    return ans;
}

int n;
int q;
int main() {
    io;
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    cin >> n >> q;
    vector<ll> v(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
    }
    vector<ll> bit = build(v);
    while (q--) {
        int type;
        cin >> type;
        if (type == 0) {
            ll index, value;
            cin >> index >> value;
            update(bit, index, value);
        }
        if (type == 1) {
            int L, R;
            cin >> L >> R;
            cout << sum(bit, L, R) << '\n';
        }
        if (type == 2) {
            int target;
            cin >> target;
            cout << search(bit, target) << '\n';
        }
    }

    return 0;
}