Cod sursa(job #440890)

Utilizator OdinSandu Bogdan-Mihai Odin Data 12 aprilie 2010 17:14:33
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<stdio.h>
int n,m,v1,v2,c[100005],i,type,T;
void update(int ind, int val)
{
	int poz=0;
	while(ind<=n)
	{
		c[ind]+=val;
		while( !(ind & (1<<poz) ) )
			poz++;
		ind += (1<<poz);
		poz++;
	}
}
int query(int ind)
{
	int poz=0,S=0;
	while(ind>0)
	{
		S+=c[ind];
		while ( !(ind & (1<<poz) ) )
			poz++;
		ind -= (1<<poz);
		poz++;
	}
	return S;
}
int binary_search(int val)
{
	int j,s;
	for(s=1;s<n;s<<=1);
	for(j=0;s;s>>=1)
		if(j+s<=n && query(j+s)<=val)
			j+=s;
	return j;
}
int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&v1);
		update(i,v1);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d",&type);
		if(type==0)
		{
			scanf("%d %d",&v1,&v2);
			update(v1,v2);
		}
		if(type==1)
		{
			scanf("%d %d",&v1,&v2);
			T=query(v2)-query(v1-1);
			printf("%d\n",T);
		}
		if(type==2)
		{
			scanf("%d",&v1);
			T=binary_search(v1);
			if( query(T) == v1)
				printf("%d\n",T);
			else printf("-1\n");
		}
	}
	return 0;
}