Cod sursa(job #2218860)

Utilizator axelteoTeodor Dutu axelteo Data 6 iulie 2018 02:27:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cmath>

using namespace std;

#define MAX_N 100001

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

int bit[MAX_N], n, numQueries;

void updateBIT(int pos, int val) {
    for (; pos <= n; pos += (pos & (~pos + 1))) {
        bit[pos] += val;
    }
}

int getSum(int posX, int posY) {
    int sum = 0;

    for (; posY; posY -= (posY & (~posY + 1))) {
        sum += bit[posY];
    }

    for (--posX; posX; posX -= (posX & (~posX + 1))) {
        sum -= bit[posX];
    }

    return sum;
}

int searchForSum(int sum) {
    int step = (1 << 16);

    for (register int pos = 0; step; step >>= 1) {
        int newPos = pos + step;

        if (newPos <= n && sum >= bit[newPos]) {
            if (sum == bit[newPos]) {
                return newPos;
            }

            sum -= bit[newPos];
            pos = newPos;
        }
    }

    return -1;
}

int main() {
    char op;
    int x, y;

    fIn >> n >> numQueries;

    for (register int i = 1; i <= n; ++i) {
        fIn >> x;
        updateBIT(i, x);
    }

    for (register int i = 0; i < numQueries; ++i) {
        fIn >> op;

        switch (op) {
            case '0':
                fIn >> x >> y;

                updateBIT(x, y);
                break;

            case '1':
                fIn >> x >> y;

                fOut << getSum(x, y) << '\n';
                break;

            case '2':
                fIn >> x;

                fOut << searchForSum(x) << '\n';
                break;
        }
    }

    return 0;
}