Cod sursa(job #954865)

Utilizator smaraldaSmaranda Dinu smaralda Data 30 mai 2013 12:16:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
int n,m,i,aib[100010];
int lsb (int x)
{
	return x&-x;
}

void update (int pos, int val)
{
	for(int i=pos;i<=n;i+=lsb(i))
		aib[i]+=val;
}

int query (int pos)
{
	int ans=0;
	while(pos)
		{
			ans+=aib[pos];
			pos-=lsb(pos);
		}
	return ans;
}

int bs (int val)
{
	int i,p,k,ans=0;
	k=val;
	for(p=0;;p++)
		if((1<<p)>val)
			{
				p--;
				break;
			}
	for(i=p-1;i>=0;i--)
		if(ans+(1<<i)<=n)
			if(aib[ans+(1<<i)]<val)
				{
					ans+=(1<<i);
					val-=aib[ans];
				}
	ans++;
	if(query(ans)==k) return ans;
	return -1;
}


int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	int tip,a,b,i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		{
			scanf("%d",&a);
			update(i,a);
		}
	for(i=1;i<=m;i++)
		{
			scanf("%d",&tip);
			if(tip==0)
				{
					scanf("%d%d",&a,&b);
					update(a,b);
				}
			if(tip==1)
				{
					scanf("%d%d",&a,&b);
					printf("%d\n",query(b)-query(a-1));
				}
			if(tip==2)
				{
					scanf("%d",&a);
					printf("%d\n",bs(a));
				}
		}
	return 0;
}