Cod sursa(job #2091394)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 19 decembrie 2017 17:54:32
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMax = 1e5 + 10;
int Bit[NMax], n, m;

void updateBit(int index, int val)
{
	while(index <= n) {
		Bit[index] += val;
		index += (index & -index);
	}
}

int getSum(int index)
{
	int sum = 0;

	while(index > 0) {
		sum += Bit[index];
		index -= (index & -index);
	}

	return sum;
}

int findSum(int sum)
{
	int step = (1 << 30);

	for(int i = 0; step; step >>= 1) {
		if(i + step <= n) {
			if(getSum(i + step) == sum)
				return i + step;
			if(getSum(i + step) < sum)
				i += step;
		}
	}

	return -1;
}

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

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

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

		if(op == 0) {
			int a, b;
			in >> a >> b;
			updateBit(a, b);
		}
		else {
			if(op == 1) {
				int a, b;
				in >> a >> b;
				out << getSum(b) - getSum(a - 1) << '\n';
			}
			else {
				int a;
				in >> a;
				out << findSum(a) << '\n';
			}
		}
	}

	in.close(); out.close();

	return 0;
}