Cod sursa(job #3242058)

Utilizator CondoracheAlexandruCondorache Alexandru CondoracheAlexandru Data 8 septembrie 2024 14:47:37
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define F first
#define S second
#define endl '\n'
#define all(a) (a).begin(),(a).end()
using namespace std;
const ll maxn = 1e5 + 5;

ifstream fin("aib.in");
ofstream fout("aib.out");

class FenwickTree {
public:
    FenwickTree(ll n);
    FenwickTree(vector<ll> const &a);
    ll query(ll r);
    ll sum(ll l, ll r);
    void update(ll idx, ll delta);
    void rangeUpdate(ll l, ll r, ll val);
    ll foo(ll a);
public:
    vector<ll> bit;
    ll n;
};
 
FenwickTree::FenwickTree(ll n) {
    this->n = n;
    bit.assign(n, 0);
}

FenwickTree::FenwickTree(vector<ll> const &a) : FenwickTree(a.size()) {
    for (ll i = 0; i < n; i++) {
        bit[i] += a[i];
        ll r = i | (i + 1);
        if (r < n) bit[r] += bit[i];
    } 
}

ll FenwickTree::query(ll r) {
    ll sum = 0;
    for (; r >= 0; r = (r & (r + 1)) - 1) {
        sum += bit[r];
    }
    return sum;
}

ll FenwickTree::sum(ll l, ll r) {
    return query(r) - query(l - 1);
}

void FenwickTree::update(ll idx, ll delta) {
   for (; idx < n; idx = idx | (idx + 1)) {
        bit[idx] += delta;
    }
}


void FenwickTree::rangeUpdate(ll l, ll r, ll val) {
    update(l, val);
    update(r + 1, -val);
}

ll FenwickTree::foo(ll a) {
    ll l = 0;
    ll r = bit.size() - 1;
    while (l <= r) {
        ll mid = l + (r - l) / 2;
        if (query(mid) >= a) {
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    if (query(l) == a) {
        return l + 1;
    }
    else {
        return -1;
    }
}

void solve() {
    ll n, q;
    fin >> n >> q;
    vector<ll> a(n);
    for (ll i = 0; i < n; i++) {
        fin >> a[i];
    }
    FenwickTree tree(a);
    while (q--) {
        ll type;
        fin >> type;
        if (type == 0) {
            ll a, b;
            fin >> a >> b;
            a--;
            tree.update(a, b);
        }
        else if (type == 1) {
            ll a, b;
            fin >> a >> b;
            a--;
            b--;
            fout << tree.sum(a, b) << endl;
        }
        else {
            ll a;
            fin >> a;
            fout << tree.foo(a) << endl;
        }
    }
}
 
int main() {
    ll t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}