Cod sursa(job #324933)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 18 iunie 2009 01:42:50
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>

#define file_in "aib.in"
#define file_out "aib.out"

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

int aib[100100],v[100100];
int n,m;
int tip,a,b,poz,s;

void add(int x,int val)   
{   
    int i;   
    for(i=x;i<=n;i+=zeros(i))   
      aib[i]+=val;   
}  


int compute(int x)   
{   
    int i,ret=0;   
    for(i=x;i>0;i-=zeros(i))   
        ret+=aib[i];   
    return ret;   
}   

int binary_search(int val)   
{   
    int i,step,x;   
    for (step=1;step<=n;step<<=1);   
    for (i=0;step;step>>=1)   
        if (i+step<=n && aib[i+step]<=val)   
        {
			i+=step;
			val-=aib[i];
			if (val==0)
				return i;
		}
    return -1;   
}  


int main()
{
	int i,ret;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n,&m);
	for (i=1;i<=n;++i)
	{
		scanf("%d", &v[i]);
		add(i,v[i]);
	}
	while(m--)
	{
		scanf("%d", &tip);
		if (tip==0)//add
	    {
			scanf("%d %d", &a,&b);
			add(a,b);
		}
		if (tip==1)//compute
		{
			scanf("%d %d", &a,&b);
			printf("%d\n", compute(b)-compute(a-1));
		}
		if (tip==2)
		{
			scanf("%d", &a);
			printf("%d\n", binary_search(a));   

		}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}