Cod sursa(job #481371)

Utilizator andreioneaAndrei Onea andreionea Data 31 august 2010 14:53:24
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
#include<string.h>
#define MAXN 15000
#define infile "datorii.in"
#define outfile "datorii.out"
int A[MAXN];
int C[MAXN];
FILE *f,*g;
int m,n;
int trail_zero(int x)
{
	int ret = 1;
	while(x&1){ 
		ret<<=1;
		x>>=1;
	}
	return ret;
}
void del(int poz,int val)
{
	while(poz<=n){
		C[poz-1] -= val;
		poz += trail_zero(poz); 
	}
}
void add(int poz,int val)
{
	while(poz<=n){
		C[poz-1] += val;
		poz += trail_zero(poz); 
	}
}
int val_to_x(int poz)
{
	int ret = 0;
	if(poz == 0)
		return ret;
	while(poz>=1){
		ret += C[poz-1];
		poz -= trail_zero(poz); 
	}
	return ret;
}
void query(int a, int b)
{
	int x = val_to_x(b) - val_to_x(a - 1);
	fprintf(g,"%d\n",x);
}
void init()
{
	int i;
	memset(C,0,n);
	for(i = 0; i < n; ++i)
		add(i+1,A[i]);
}
int main()
{
	int i,op,a,b;
	f = fopen(infile,"r");
	g = fopen(outfile,"w");
	fscanf(f,"%d%d",&n,&m);
	for(i = 0; i < n; ++i)
		fscanf(f,"%d",(A + i));
	init();
	while(m){
		--m;
		fscanf(f,"%d%d%d",&op,&a,&b);
		if(op == 0)
			del(a,b);
		else
			query(a,b);
	}
	fclose(f);
	fclose(g);
	return 0;
}