Cod sursa(job #1213633)

Utilizator sorin2kSorin Nutu sorin2k Data 28 iulie 2014 17:18:24
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<iostream>
using namespace std;

int aib[200001];

void update(int pos, int val, int n) {
	while(pos <= n) {
		aib[pos] += val;
		pos += pos & -pos;
	}
}

int query(int pos) {
	int sum = 0;
	while(pos > 0) {
		sum += aib[pos];
		pos -= pos & -pos;
	}
	return sum;
}

int binarySearch(int sum, int n) {
	int poz = 1, pas, current = 0, ans = -1;
	
	while(poz <= n) poz *= 2;
	poz /= 2;
	pas = poz;

	while(pas > 0) {
		pas /= 2;
		if(current + aib[poz] <= sum) {
			if(poz + pas <= n) {
				ans = poz;
				current += aib[poz];
				poz += pas;
			}
		} else {
			poz -= pas;
		}
	}
	if(current == sum) return ans;
	return -1;
}

int main() {
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	int a, b, opt, n, m, i;
	cin >> n >> m;
	for(i = 1; i <= n; i++) {
		cin >> a;
		update(i, a, n);
	}

	for(i = 0; i < m; i++) {
		cin >> opt;
		if(opt == 0) {
			cin >> a >> b;
			update(a, b, n);
		}
		if(opt == 1) {
			cin >> a >> b;
			cout << query(b) - query(a-1) << "\n";
		}
		if(opt == 2) {
			cin >> a;
			cout << binarySearch(a, n) << "\n";
		}
	}
	return 0;
}