Cod sursa(job #936922)

Utilizator forgetHow Si Yu forget Data 9 aprilie 2013 03:27:19
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
using namespace std;

int main() {
	ifstream fin("aib.in");
	ofstream fout("aib.out");
	int n, m;
	fin >> n >> m;
	int a[n+1];
	for (int i = 1; i <= n; ++i)
		fin >> a[i];
	for (int stp = 1; stp < n; stp *= 2)
		for (int i = 2*stp; i <= n; i += 2*stp)
			a[i] += a[i-stp];
	int maxstp = 1;
	while (maxstp <= n) maxstp *= 2;
	maxstp /= 2;

	int q, b, c, val;
	for (; m > 0; --m) {
		fin >> q;
		if (q == 0) {
			fin >> b >> val;
			for (int stp = 1; b <= n; stp <<= 1) {
				if (b & stp) {
					a[b] += val;
					b += stp;
				}
			}
		}
		else if (q == 1) {
			fin >> b >> c;
			--b;
			val = 0;
			for (int stp = 1; b != c; stp <<= 1) {
				if (b & stp) {
					val -= a[b];
					b -= stp;
				}
				if (c & stp) {
					val += a[c];
					c -= stp;
				}
			}
			fout << val << '\n';
		}
		else {
			fin >> val;
			b = 0;
			for (int stp = maxstp; val > 0; stp >>= 1) {
				if (val >= a[b+stp]) {
					b += stp;
					val -= a[b];
				}
			}
			fout << b << '\n';
		}
	}
	return 0;
}