Cod sursa(job #202153)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 6 august 2008 13:56:03
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#define IN "datorii.in"
#define OUT "datorii.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<14

int suma,M,N;
int v[N_MAX];
int lg[N_MAX],rmq[16][N_MAX]; 

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d",&N,&M);
	FOR(i,1,N)
		scanf("%d", v+i);
}		

void update()
{
	FOR(i,1,N)
		rmq[0][i] = v[i];
		
	for(int i=1; (1<<i) <= N;++i)
		for(int j=1;j<=N && j+(1<<i)-1 <= N;++j)
			rmq[i][j] = rmq[i-1][j] + rmq[i-1][j+(1<<i) - (1<<(i-1))];
}

void querry(int x,int y)
{
	if(x >= y)
		suma += rmq[0][x];
	else
	{
		int dif = y-x+1;
		int log = lg[dif];
		suma += rmq[log][x];
		querry(x+(1<<log),y);
	}	
}

void solve()
{
	--lg[0];
	FOR(i,1,N)
		lg[i] = lg[i/2] + 1;
	update();
	
	int t,x,y;
	FOR(i,1,M)
	{
		scanf("%d%d%d\n", &t,&x,&y);
		if(!t)
			v[x] -= y,
			update();
		else
		{	
			suma=0;
			querry(x,y);
			printf("%d\n", suma);
		}	
	}
}

int main()
{
	scan();
	solve();
	return 0;
}