Cod sursa(job #3178459)

Utilizator BuddYeCioi Bebita BuddYe Data 1 decembrie 2023 18:24:58
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

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

class binaryindexedtree {
private:
    vector<int> bit;
    const int size;

public:
    binaryindexedtree(const int auxsize) : bit(auxsize + 5, 0), size(auxsize) {}

    int leastSignificantBit(int x) {
        return (x & (-x));
    }

    void add(int index, int value) {
        for (int i = index; i <= size; i += leastSignificantBit(i))
            bit[i] += value;
    }

    int prefixSum(int index) {
        int result = 0;
        for (int i = index; i >= 1; i -= leastSignificantBit(i))
            result += bit[i];
        return result;
    }

    int findPosition(int sum) {
        int left = 1, right = size, result = -1;

        while (left <= right) {
            int mid = (left + right) / 2;
            if (prefixSum(mid) >= sum) {
                result = mid;
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }

        return result;
    }
};

int main() {
    int n, m;
    in >> n >> m;
    binaryindexedtree bit(n);

    for (int i = 1; i <= n; i++) {
        int x;
        in >> x;
        bit.add(i, x);
    }

    for (int i = 1; i <= m; i++) {
        int operation;
        in >> operation;

        if (operation == 0) {
            int index, value;
            in >> index >> value;
            bit.add(index, value);
        }
        else if (operation == 1) {
            int startIndex, endIndex;
            in >> startIndex >> endIndex;
            out << bit.prefixSum(endIndex) - bit.prefixSum(startIndex - 1) << '\n';
        }
        else if (operation == 2) {
            int targetSum;
            in >> targetSum;
            out << bit.findPosition(targetSum) << '\n';
        }
    }

    return 0;
}