Cod sursa(job #2952483)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 9 decembrie 2022 12:53:17
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 100005;

int aib[Nmax];
int n, m;

void update(int pos, int val) {
    while (pos <= n) {
        aib[pos] += val;
        pos += (pos & (-pos));
    }
}

int query(int pos) {
    int sum = 0;
    while (pos > 0) {
        sum += aib[pos];
        pos -= (pos & (-pos));
    }
    return sum;
}

int bin_search(int a) {
    int lo = 1, hi = n;
    while (lo <= hi) {
        int mid = (lo + hi) >> 1;
        int sum = query(mid);
        if (sum == a)
            return mid;
        if (sum < a)
            lo = mid + 1;
        else 
            hi = mid - 1;
    }
    return -1;
}

int main() {
    string filename = "aib";
    ifstream cin(filename + ".in");
    ofstream cout(filename + ".out");

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

    while(m--) {
        int op, x, y;
        cin >> op;
        if (op == 0) {
            cin >> x >> y;
            update(x, y);
        }
        else if (op == 1) {
            cin >> x >> y;
            cout << query(y) - query(x - 1) << '\n';
        }
        else {
            cin >> x;
            cout << bin_search(x) << '\n';
        }
    }

    return 0;
}