Cod sursa(job #395877)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 13 februarie 2010 22:13:40
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
#define zeros(x) ((x^(x-1))&x)
long a, b, i, k, n, m, v[100000];

void add(long x, long a);
long sum(long x);

int main()
{
  freopen("aib.in", "r", stdin);
  freopen("aib.out", "w", stdout);
  scanf("%ld%ld", &n, &m);
  for (i=1; i<=n; i++)
  {
	scanf("%ld", &a);
	add(i, a);
  }//for i
  for (i=1; i<=m; i++)
  {
	scanf("%ld", &k);
	if (k==0)
	{
	  scanf("%ld%ld", &a, &b);
	  add(a, b);
	}//if 0
	if (k==1)
	{
	  scanf("%ld%ld", &a, &b);
	  printf("%ld\n", sum(b)-sum(a-1));
	}//if 1
	if (k==2)
	{
	  scanf("%ld", &a);
	  b=1;
	  while ((sum(b)!=a)&&(b<n))
			b++;
		if (sum(b)==a)
		  printf("%ld\n", b);
		else
			printf("-1\n");
	}//if 2
  }//for i
  return 0;
}//main

void add(long x, long a)
{
  long i;
  for (i=x; i<=n; i+=zeros(i))
	v[i]+=a;
}//add

long sum(long x)
{
  long i, temp=0;
  for (i=x; i>0; i-=zeros(i))
	temp+=v[i];
  return temp;
}//sum