Cod sursa(job #69527)

Utilizator peanutzAndrei Homorodean peanutz Data 3 iulie 2007 14:08:20
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <stdio.h>
#define NMAX 15005

int c[NMAX];
int n, m;

void add(int v, int x)
{
	int poz = 0;
	while(x <= n)
	{
		c[x] += v;
		while((x & (1<<poz)) == 0)
			++poz;
		x += (1<<poz);
		++poz;
	}
}

int suma(int dr)
{
	int s = 0, poz = 0;
	while(dr > 0)
	{
		s += c[dr];
		while((dr & (1<<poz)) == 0)
			++poz;
		dr -= (1<<poz);
		++poz;
	}
	return s;
}

void write(int st, int dr)
{
	printf("%d\n", suma(dr) - suma(st-1));
}

int main()
{
	int op, a, b;
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);

	scanf("%d %d", &n, &m);

	int i;
	for(i = 1; i <= n; ++i)
		scanf("%d", &a), add(a, i);

	for(i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &op, &a, &b);
		if(!op)
			add(-b, a);
		else
			write(a, b);
	}
	return 0;
}