Cod sursa(job #84407)

Utilizator ZuziFilip Sanziana Zuzi Data 14 septembrie 2007 22:23:21
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
int n, m, c[15001], t, v, st, dr;


void adaug(int t, int v)
{
	int p = 1;
	while ( t <= n )
	{
		c[t] += v;
		while ( !(t&p))
			 p *= 2;

		t += p;
		p *= 2;


	}
}

void achitare(int t, int v)
{
	int p = 1;
	while ( t <= n )
	{
		c[t] -= v;
		while ( !(t&p))
			 p *= 2;

		t += p;
		p *= 2;


	}
}


int interogare(int dr)
{
	int s = 0, p = 1;
	while ( dr >0 )
	{
		s += c[dr];
		while ( !(dr & p ))
			p *= 2;
		dr -=p;
		p *= 2;
	}
	return s;
}


void read()
{
	int i, b, r1, r2;
	scanf("%d%d", &n, &m);
	for ( i = 1; i <= n; i++)
	{
		scanf("%d", &v);
		adaug(i,v);
	}
	for (i = 1; i <= m; i++)
	{
		scanf("%d", &b);
		if ( b == 0)
			{
				scanf("%d%d", &t, &v);
				achitare(t,v);
			}
		else
			{
				scanf("%d%d", &st, &dr);
				r1 = interogare(st-1);
				r2 = interogare(dr);
				printf("%d\n", r2-r1);
			}
	}
}

int main()
{
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	read();
	return 0;
}