Cod sursa(job #1213634)

Utilizator sorin2kSorin Nutu sorin2k Data 28 iulie 2014 17:22:03
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
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;
	scanf("%d %d", &n, &m);
	for(i = 1; i <= n; i++) {
		scanf("%d", &a);
		update(i, a, n);
	}

	for(i = 0; i < m; i++) {
		scanf("%d", &opt);
		if(opt == 0) {
			scanf("%d %d", &a, &b);
			update(a, b, n);
		}
		if(opt == 1) {
			scanf("%d %d", &a, &b);
			printf("%d\n", query(b) - query(a-1));
		}
		if(opt == 2) {
			scanf("%d", &a);
			printf("%d\n", binarySearch(a, n));
		}
	}
	return 0;
}