Cod sursa(job #320685)

Utilizator TyberFMI Dogan Adrian Ioan Lucian Tyber Data 5 iunie 2009 14:58:12
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 100010
int min(int,int);
void update(int,int);
int query(int);
int search(int);
int n,m,arb[nmax];
int main()
{
	int i,k,x,y;
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n,&m);
	memset(arb,0,sizeof(arb));
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		update(i,x);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d",&k);
		if(k<2)
		{
			scanf("%d %d",&x,&y);
			if(!k)
				update(x,y);
			else 
				printf("%d\n",query(y)-query(x-1));
		}
		else
		{
			scanf("%d",&x);
			printf("%d\n",search(x));
		}
	}
	return 0;
}
int min(int a,int b)
{
	if(a<b)
		return a;
	else
		return b;
}
void update(int i,int x)
{
	int c=0;
	while(i<=n)
	{
		arb[i]=arb[i]+x;
		while(!(i&(1<<c)))c++;
		i=i+(1<<c);
		c++;
	}
}
int search(int x)
{
	int i,j;
	for(j=1;j<n;j<<=1);
	for(i=0;j;j>>=1)
	{
		if(i+j<=n)
		{
			if(x>=arb[i+j])
			{
				i=i+j;
				x=x-arb[i];
				if(!x)
					return i;
			}
		}
	}
	return -1;
}
int query(int i)
{
	int c=0,s=0;
	while(i>0)
	{
		s=s+arb[i];
		while(!(i&(1<<c)))c++;
		i=i-(1<<c);
		c++;
	}
	return s;
}