Cod sursa(job #181830)

Utilizator marinaMarina Horlescu marina Data 19 aprilie 2008 00:29:01
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#define INPUT "aib.in"
#define OUTPUT "aib.out"
#define NMAX 100001

int tree[NMAX];
int N, M;

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

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

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

void citire()
{
	scanf("%d %d", &N, &M);
	int i;
	for(i = 1; i <= N; ++i)
	{
		int val;
		scanf("%d", &val);
		update(i, val);
	}
}
int main()
{
	freopen(INPUT, "r", stdin);
	freopen(OUTPUT, "w", stdout);
	
	citire();
	
	int i;
	for(i = 1; i <= M; ++i)
	{
		int tip, a, b;
		scanf("%d", &tip);
		if(tip == 0)
		{
			scanf("%d %d", &a, &b);
			update(a, b);
		}
		else if(tip == 1)
		{
			scanf("%d %d", &a, &b);
			printf("%d\n", query(b) - query(a-1));
		}
		else if(tip == 2)
		{
			scanf("%d", &a);
			printf("%d\n", search(a));
		}
	}
	return 0;
}