Cod sursa(job #2077752)

Utilizator bcrisBianca Cristina bcris Data 28 noiembrie 2017 16:17:12
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

#define NMAX 100001
int N, M;
int tree[NMAX];

void Update(int idx, int val) {
	while (idx <= N) {
		tree[idx] += val;
		idx += (idx & -idx); 
	}
}

int Query(int idx) {
	int sum = 0;
	while (idx > 0) {
		//printf("%d %d %d\n", sum, idx, tree[idx]);
		sum += tree[idx];
		idx -= (idx & -idx);
		//printf("%d %d %d\n", sum, idx, tree[idx]);

	}
	return sum;
}

int Search(int val) {
	int i, step;
	for (step = 1; step <= N; step <<= 1) ;
	for (i = 0; step; step >>= 1) {
		if (i + step <= N) {
			if (val >= tree[i + step]) {
				i += step; 
				val -= tree[i];
				if (val == 0) {
					return i;
				}
			}
		}
	}

	return -1;
}


int main() {

	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);

	scanf("%d %d", &N, &M);

	memset(tree, 0, sizeof(tree));

	int val;
	for (int i = 1; i <= N; i++) {
		scanf("%d ", &val);
		Update(i, val);
		//printf("%d ", tree[i]);
	}

	int op;
	for (; M; M--) {
		scanf("%d", &op);
		if (op < 2) {
			int x, y;
			scanf("%d %d ", &x, &y);
			if (op == 0) {
				Update(x, y);
			} else {
				//printf("%d %d\n", x, y);
				printf("%d\n", Query(y) - Query(x - 1));
			}
		} else {
			int x;
			scanf("%d ", &x);

			printf("%d\n", Search(x));
		}
	}

	return 0;
}