Cod sursa(job #294841)

Utilizator spidyvenomMarius Toma spidyvenom Data 2 aprilie 2009 19:54:46
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<fstream.h>
#define nmax 100001
int aib[nmax],i,j,k,l,m,n,x,y;
ifstream f("aib.in");
ofstream g("aib.out");

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

int querry(int poz)
{
int k=0,sum=0;
while(poz>0)
	{
	sum+=aib[poz];
	while(!(poz&(1<<k)))
		k++;
	poz-=1<<k;
	k++;
	}
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>=aib[i+step])
				{
				i+=step;
				val-=aib[i];
				if(!val) return i;
				}
			}
		}
return -1;
}

int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
	{
	f>>x;
	upd(i,x);
	}
for(i=1;i<=m;i++)
	{
	f>>k;
	if(k==0)
		{
		f>>x>>y;
		upd(x,y);
		}
	else
		if(k==1)
			{
			f>>x>>y;
			g<<querry(y)-querry(x-1)<<'\n';
			}
		else
			{
			f>>x;
			g<<search(x)<<'\n';
			}
		}
return 0;
}