Cod sursa(job #2771207)

Utilizator AlexZeuVasile Alexandru AlexZeu Data 26 august 2021 09:36:35
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

const int mxN = 1e5 + 5;

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

int N, M, aib[mxN];

void update(int pos, int value) {
    for (int i = pos; i <= N; i += ((i) & (-i))) {
        aib[i] += value;
    }
}

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

void Search(int req_sum, int left, int right) {
    if (left == right) {
        if (query(left) == req_sum) {
            fout << left << '\n';
            return;
        }
        fout << -1 << '\n';
        return;
    } 
    int mij = (left + right) / 2;
    if (query(mij) >= req_sum) {
        Search(req_sum, left, mij);
    } else {
        Search(req_sum, mij + 1, right);
    }
}

int main() {
    ios::sync_with_stdio(false), fin.tie(nullptr);
    fin >> N >> M;
    for (int i = 1; i <= N; ++i) {
        int x; fin >> x;
        update(i, x);
    }
    while (M--) {
        int cerinta; fin >> cerinta;
        if (cerinta == 0) {
            int a, b; fin >> a >> b;
            update(a, b);
        } else if (cerinta == 1) {
            int a, b; fin >> a >> b;
            fout << query(b) - query(a - 1) << '\n';
        } else {
            int a; fin >> a;
            Search(a, 1, N);
        }
    }
    return 0;
}