Cod sursa(job #714196)

Utilizator DSzprogDombi Szabolcs DSzprog Data 15 martie 2012 15:38:00
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstring>
#include <cstdio>
#include <cmath>

int n, m, l;
int heap[262144];

int level(int n) {
	int level = 1;
	while (n > level) {
		level *= 2;
	}
	return(level);
}

int add(int at, int val) {
	at = at + l - 1;
	while (at) {
		heap[at] += val;
		at /= 2;
	}
}

int search(int nod, int val) {
	while (nod < l) {
		if (val < heap[nod]) {
			nod = nod * 2;
		} else {
			nod = nod * 2 + 1;
		}
	}
	return(nod - l + 1);
}

int sum(int left, int right) {
	left = l + left - 1;
	right = l + right - 1;
	int sum = 0;
	while (left < right) {
		if (left % 2 == 0 && right % 2 == 1) {
			left /= 2;
			right /= 2;
		} else {
			if (left % 2) {
				sum += heap[left];
				++left;
			} else {
				sum += heap[right];
				--right;
			}
		}
	}
	sum += heap[left];
	return(sum);
}

int main() {
	FILE * in = fopen("aib.in", "rt");
	FILE * out = fopen("aib.out", "wt");

	fscanf(in, "%d%d", &n, &m);
	l = level(n);
	for (int i = 0; i < n; ++i) {
		fscanf(in, "%d", &heap[l + i]);
	}
	for (int i = l - 1; i > 0; --i) {
		heap[i] = heap[i * 2] + heap[i * 2 + 1];
	}

	int a, b, c;
	for (int i = 0; i < m; ++i) {
		fscanf(in, "%d", &a);
		if (a == 2) {
			fscanf(in, "%d", &b);
			fprintf(out, "%d\n", search(1, b));
		} else {
			fscanf(in, "%d%d", &b, &c);
			if (a) {
				fprintf(out, "%d\n", sum(b, c));
			} else {
				add(b, c);
			}
		}
	}

	fclose(in);
	fclose(out);
}