Cod sursa(job #3334338)

Utilizator ONLYGODYBochis Andrei ONLYGODY Data 17 ianuarie 2026 11:11:42
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;
#define ll int
#define LSB(x) (x & -x)
// #define fi cin
// #define fo cout

string FILENAME = "aib";
ifstream fi (FILENAME + ".in");
ofstream fo (FILENAME + ".out");

vector<ll> aib;
ll n, m, maxpow = 1;

void update(ll, ll);
ll q1(ll);
ll q2(ll);

int main() {

    fi >> n >> m;
    aib.resize(n + 1);

    for(ll i = 1, x; i <= n; ++i) {

        fi >> x;
        update(i, x);
        if(1 << (maxpow + 1) == i)
            ++maxpow;
    }

    for(ll q; m && fi >> q; --m)

        if(!q) {

            ll a, b;
            fi >> a >> b;
            update(a, b);
        }
        else if (q == 1) {

            ll a, b;
            fi >> a >> b;
            a = q1(a - 1);
            b = q1(b);

            fo << b - a << '\n';
        }
        else{

            ll a;
            fi >> a;
            fo << q2(a);
        }

    return 0;
}

void update(ll pos, const ll val) {

    for(; pos <= n; pos += LSB(pos))
        aib[pos] += val;
}

ll q1(ll x) {

    ll sum = 0;

    for(; x > 0; x -= LSB(x))
        sum += aib[x];

    return sum;
}

ll q2(ll val) {

    ll ans = 0;

    for(ll p = maxpow; p >= 0 ; --p) {

        if(aib[ans + (1 << p)] <= val) {

            ans += (1 << p);
            val -= aib[ans];
        }
    }

    return ans;
}