Cod sursa(job #2876011)

Utilizator mex7Alexandru Valentin mex7 Data 22 martie 2022 20:38:49
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define ll long long
#define cin fin
#define cout fout
using namespace std;

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

int n, m;
int bit[400010], v[100001], logBase2[100001];

void update(int x, int val) {
    int ind = x;
    while (ind <= n) {
        bit[ind] += val;
        ind += ind & (-ind);
    }
}

int query(int x) {
    int sum = 0;
    int ind = x;
    while (ind) {
        sum += bit[ind];
        ind -= ind & (-ind);
    }

    return sum;
}

int main() {
    ios :: sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
        update(i, v[i]);
    }

    for (int q = 1; q <= m; ++q) {
        int type;

        cin >> type;
        if (!type) {
            int ind, val;

            cin >> ind >> val;
            v[ind] = val;
            update(ind, val);
        } else if (type == 1) {
            int wantL, wantR;

            cin >> wantL >> wantR;
            cout << query(wantR) - query(wantL - 1) << '\n';
        } else {
            int sum;

            cin >> sum;
            for (int i = 1; i <= n; ++i)
                if (query(i) == sum) {
                    cout << i << '\n';
                    break;
                }
        }
    }

    // for (int i = 1; i <= n; ++i) {
    //     for (int j = i; j <= n; ++j) {
    //         cout << '(' << i << ", " << j << ") -> " << query(j) - query(i - 1) << '\n';
    //     }
    // }

    return 0;
}