Cod sursa(job #440893)

Utilizator OdinSandu Bogdan-Mihai Odin Data 12 aprilie 2010 17:18:25
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 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 && c[j+s]<=val)
		{
			j+=s;
			val-=c[j];
			if(!val)return j;
		}
	return -1;
}
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);
			printf("%d\n",binary_search(v1));
		}
	}
	return 0;
}