Cod sursa(job #1445804)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 31 mai 2015 01:28:55
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#include <cstdlib>
//#define _submit
#ifdef _submit
#define InFile "aib.in"
#define OutFile "aib.out"
#else
#define InFile "fis.in"
#define OutFile "fis.out"
#endif

//#define MAXARBSZ 264000

int* arbInt;
int arbSz;

int gudSz(int n) {
	int p = 1;
	while (p < n)
		p <<= 1;
	return p;
}

void update(int pos, int x) {
	pos += arbSz - 1;
	while (pos) {
		arbInt[pos] += x;
		pos >>= 1;
	}
}

int query(int left, int right) {
	left += arbSz - 1;
	right += arbSz - 1;
	int result = 0;
	while (left <= right) {
		if (left & 1)
			result += arbInt[left];
		if (!(right & 1))
			result += arbInt[right];
		left = (left + 1) >> 1;
		right = (right - 1) >> 1;
	}
	return result;
}

int query2(int srch) {
	int left = 1;
	int right = arbSz;
	int sum_to_right = arbInt[1];
	int curNod = 1;
	int found = -1;
	while (left <= right && curNod < (arbSz << 1)) {
		int mid = (left + right) >> 1;
		int sum_to_mid = sum_to_right - arbInt[(curNod << 1) + 1];
		if (sum_to_mid == srch) {
			found = mid;
			right = mid;
			sum_to_right = sum_to_mid;// -arbInt[right + arbSz - 1];
			curNod <<= 1;
		}
		else if (sum_to_mid < srch) {
			left = mid + 1;
			curNod = (curNod << 1) + 1;
		}
		else if (sum_to_mid > srch) {
			right = mid;
			sum_to_right = sum_to_mid;// -arbInt[right + arbSz - 1];
			curNod <<= 1;
		}
	}
	if (sum_to_right == srch)
		return right;
	return found;
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OutFile, "w", stdout));
	int N, M;
	scanf("%d%d", &N, &M);
	arbSz = gudSz(N);
	arbInt = (int*)malloc(arbSz*2*sizeof(int));
	for (int i = arbSz; i < arbSz + N; i++)
		scanf("%d", &arbInt[i]);
	for (int i = arbSz + N; i< (arbSz << 1); i++)
		arbInt[i] = 0;
	for (int i = arbSz - 1; i > 0; i--)
		arbInt[i] = arbInt[i << 1] + arbInt[(i << 1) + 1];
	for (int i = 0; i < M; i++) {
		int o, a, b;
		scanf("%d%d", &o, &a);
		if (o == 1) {
			scanf("%d", &b);
			printf("%d\n", query(a, b));
		}
		else if (o == 0) {
			scanf("%d", &b);
			update(a, b);
		}
		else
			printf("%d\n", query2(a));
	}
	free(arbInt);
	return 0;
}