Cod sursa(job #2792748)

Utilizator guzgandemunteIonescu Laura guzgandemunte Data 2 noiembrie 2021 11:37:33
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#define NMAX 100000

using namespace std;

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

int a[NMAX];
int n, m, x, y, opt;

// returns least significant bit of a number
inline int LBT(int x) {
    return x & -x;
}

int prefixSum(int i){
    int sum = 0;
    while (i) {
        sum += a[i];
        i = i - LBT(i);
    }
    return sum;
}

int sumQuery(int i, int j) {
    return prefixSum(j) - prefixSum(i - 1);
}

void add(int i, int x) {
    while (i <= n) {
        a[i] += x;
        i += LBT(i);
    }
}

int binarySearchPrefix(int x, int st, int dr) {
    int mij;
    while (dr - st > 1) {
        mij = st + (dr - st) / 2;
        if (prefixSum(mij) > x) dr = mij;
        else st = mij;
    }
    return prefixSum(st) == x ? st : -1;
}

int main()
{
    fin >> n >> m;

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

    while (m--) {
        fin >> opt;
        switch (opt)
        {
            case 0: {
                fin >> x >> y;
                add(x, y);
                break;
            }
            case 1: {
                fin >> x >> y;
                fout << sumQuery(x, y) << '\n';
                break;
            }
            case 2: {
                fin >> x;
                fout << binarySearchPrefix(x, 1, n + 1) << '\n';
            }
        }
    }

    fin.close();
    fout.close();
    return 0;
}