Cod sursa(job #2227059)

Utilizator TrixerAdrian Dinu Trixer Data 31 iulie 2018 05:27:40
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>

#define MAX_N 100001

int n, m;
int bit[MAX_N];

void print_array(int *v, int a, int b)
{
	printf("[");
	for (int i = a; i < b; i++)
		printf("(%d) %d, ", i, v[i]);
	printf("(%d) %d]\n", b, v[b]);
}

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

int query(int idx)
{
	int sum = 0;

	while (idx > 0) {
		sum += bit[idx];
		idx -= (idx & -idx);
	}

	return sum;
}

int search(int val)
{
	int tidx, idx = 0;
	int step = 1;

	while (step < n) {
		step <<= 1;
	}

	while (step > 0 && idx < n) {
		tidx = idx + step;
		if (tidx <= n && bit[tidx] <= val) {
			idx = tidx;
			val -= bit[tidx];
		}
		step >>= 1;
	}

	if (val == 0)
		return idx;
	return -1;
}

int main(void)
{
	// read input
	int op, a, b;

	freopen("aib.in", "r", stdin);
	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; i++) {
		scanf("%d", &a);
		update(i, a);
	}

	// print output
	freopen("aib.out", "w", stdout);
	for (int i = 0; i < m; i++) {
		scanf("%d", &op);

		switch (op) {
		case 0: scanf("%d%d", &a, &b);
			update(a, b);
			break;
		case 1: scanf("%d%d", &a, &b);
			printf("%d\n", query(b) - query(a - 1));
			break;
		case 2: scanf("%d", &a);
			printf("%d\n", search(a));
			break;
		}
	}

	return 0;
}