Cod sursa(job #634515)

Utilizator sebii_cSebastian Claici sebii_c Data 16 noiembrie 2011 16:44:37
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#define NMAX 100010

int tree[NMAX];
int N;

int readFreq(int idx)
{
	int sum = 0;
	while (idx > 0) {
		sum += tree[idx];
		idx -= (idx & -idx);
	}
	return sum;
}

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

int search(int val)
{
	int i = 0;
	int bitMask;
	
	for (bitMask = 1; bitMask < N; bitMask<<=1);
	
	for (i=0; bitMask; bitMask >>= 1) {
		if (i + bitMask <= N) {
			if (val >= tree[i+bitMask]) {
				i += bitMask; val -= tree[i];
				if (!val)
					return i;
			}
		}
	}
	return -1;
}

int main()
{
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	int M, i, x, y, type;
	scanf("%d %d", &N, &M);
	for (i=1; i<=N; ++i) {
		scanf("%d", &x);
		update(i, x);
	}
	
	for (i=1; i<=M; ++i) {
		scanf("%d", &type);
		if (type == 0) {
			scanf("%d %d", &x, &y);
			update(x, y);
		}
		if (type == 1) {
			scanf("%d %d", &x, &y);
			printf("%d\n", readFreq(y) - readFreq(x-1));
		}
		if (type == 2) {
			scanf("%d", &x);
			printf("%d\n", search(x));
		}
	}
	return 0;
}