Cod sursa(job #419258)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 17 martie 2010 10:50:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<stdio.h>
#define nmax 100011

int aib[nmax],n,m,x,op,a,b,i, n2;

void update(int poz, int val)
{
	int pow=0;
	while(poz<=n)
	{
		aib[poz]+=val;
		for(;!(poz&1<<pow);pow++);
		poz+=1<<pow;
		pow++;
	}
}

int query(int poz)
{
	int pow=0, sum=0;
	while(poz>0)
	{
		sum+=aib[poz];
		for(;!(poz&1<<pow);pow++);
		poz-=1<<pow;
		pow++;
	}
	return sum;
}

int sum(int val)
{
	int pow=n2,i=0;
	for(;pow;pow>>=1)
		if(i+pow<=n&&val>=aib[i+pow])
		{
			i+=pow;
			val-=aib[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);
	int pow=1;
	for(;pow<n;pow<<=1);
	n2=pow;
	for(i=1;i<=n;i++)
	{
		scanf("%d", &x);
		update(i, x);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d", &op);
		if(op==0)
		{
			scanf("%d %d", &a, &b);
			update(a,b);
		}
		else if(op==1)
		{
			scanf("%d %d", &a, &b);
			printf("%d\n", query(b)-query(a-1));
		}
		else 
		{
			scanf("%d", &a);
			printf("%d\n", sum(a));
		}
	}
	return 0;
}