Cod sursa(job #2762023)

Utilizator EusebiudistrugatorulLionel Messi Eusebiudistrugatorul Data 5 iulie 2021 10:34:55
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>
#define Intro ios::sync_with_stdio(0), cin.tie(0)
#define ll long long
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int const N = 1e5 + 5;
int sums[N], tree[N], elements, queries;

void update(int pos, int value) {
    while (pos <= elements) {
        tree[pos] += value;
        pos += pos & -pos; // here
    }
}

int query(int right) {
    int sum = 0;
    while (right >= 1) {
        sum += tree[right];
        right -= right & -right; // here
    }
    return sum;
}

int find_pos(int target) {
    int step;
    for (step = 1; step < elements; step <<= 1);
    for (int i = 0; step; step >>= 1) {
        if (i + step > elements) {
            continue;
        }
        int value = query(i + step);
        if (target >= value) {
            i += step;
            if (target == value) {
                return i;
            }
        }
    }
    return -1;
}

int main() {
    Intro;
    fin >> elements >> queries;
    for (int i = 1; i <= elements; ++i) {
        int value; fin >> value;
        sums[i] = sums[i - 1] + value;
    }
    for (int i = 1; i <= elements; ++i) {
        int largest_power = i & -i;
        tree[i] = sums[i] - sums[i - largest_power];
    }
    for (int i = 1; i <= queries; ++i) {
        int code; fin >> code;
        if (code == 0) {
            int pos, value;
            fin >> pos >> value;
            update(pos, value);
        } else if (code == 1) {
            int start, finish;
            fin >> start >> finish;
            fout << query(finish) - query(start - 1) << '\n';
        } else {
            int target; fin >> target;
            fout << find_pos(target) << '\n';
        }
    }
    //read the stuff below
    return 0;
}
/* Plan
- read the statement carefully
- write stuff down (observations and ideas)
- consider the methods
- revise the solution before implementing it
- int overflow
- edge cases
- make the implementation clearly
*/