Cod sursa(job #609148)

Utilizator soriynSorin Rita soriyn Data 19 august 2011 19:00:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>


#define maxn 100005
#define zeros(x) ( (x ^ (x - 1)) & x )

int AIB[maxn];
int N,M,op,rez=-1;

void Update(int x,int val)
{
	for(int i=x;i<=N;i+=zeros(i))
	
		AIB[i]+=val;
}


int Query(int x)
{
	int sum=0;

	for(int i=x;i>0;i-=zeros(i))
		sum+=AIB[i];
	return sum;
}

void Search(int st,int dr,int x)
{
	if(st==dr-1) 
		{
			if(Query(st)==x) rez=st;
			else if(Query(dr)==x) rez=dr;
			else rez=-1;
			return;
	}
	int val;
			val=Query((st+dr)/2);
			if(val==x) {rez=((st+dr)/2);return;}
			else if(val>x) Search(st,(st+dr)/2,x);
			else if(val<x) Search((st+dr)/2,dr,x);

	
}
		
int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	
	int x,a,b;
	
	scanf("%d %d",&N,&M);
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&x);		
		Update(i,x);
	}
     
    for(int i=1;i<=M;i++)
	{
		scanf("%d",&op);
        if(op==0)
		{
			scanf("%d %d",&a,&b);
			Update(a,b);
		}
		if(op==1)
		{
			scanf("%d %d",&a,&b);
			printf("%d\n",Query(b)-Query(a-1));
		}
		if(op==2)
		{
			scanf("%d\n",&a);
			Search(1,N,a);
			printf("%d\n",rez);
			rez=-1;
		}
	}
}