Cod sursa(job #119364)

Utilizator rapidu36Victor Manz rapidu36 Data 30 decembrie 2007 20:56:08
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
//arbori indexati binar (clasic)
#include<stdio.h>
#define N 1001
int m,n,a[N];
int zero(int x){
	int r=1;
	while(!(x&1)){
		x>>=1;
		r<<=1;
	}
	return r;
}
void adauga(int i,int x){
	while(i<=n){
		a[i]+=x;
		i+=zero(i);
	}
}
int suma(int p){
	int s=0;
	while(p){
		s+=a[p];
		p-=zero(p);
	}
	return s;
}
void calcul(){
	int i,x,tip,p,q,zi;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i){
		scanf("%d",&x);
		adauga(i,x);
	}
	/*
	for(i=1;i<=n;++i)
		printf("%d ",a[i]);
	*/
	for(i=1;i<=m;++i){
		scanf("%d",&tip);
		if(tip){
			scanf("%d%d",&p,&q);
			printf("%d\n",suma(q)-suma(p-1));
		}
		else{
			scanf("%d%d",&zi,&x);
			adauga(zi,-x);
		}
	}
}
int main(){
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	calcul();
	fclose(stdin);
	fclose(stdout);
	return 0;
}