Cod sursa(job #7997)

Utilizator root/boot/vmlinuz root Data 23 ianuarie 2007 16:13:37
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1 kb
#include <stdio.h>

int _data[32768];

int query(int n, int left, int right, int a, int b)
{
	if(a <= left && right <= b)
		return _data[n];
	int r = 0, middle = (left+right)/2;
	if(a <= middle)
		r += query(2*n, left, middle, a, b);
	if(b > middle)
		r += query(2*n+1, middle+1, right, a, b);
	return r;
}

void update(int n, int left, int right, int a, int b, int v)
{
	if(a <= left && right <= b) {
		_data[n] += v;
		return;
	}
	int middle = (left+right)/2;
	if(a <= middle)
		update(2*n, left, middle, a, b, v);
	if(b > middle)
		update(2*n+1, middle+1, right, a, b, v);
	_data[n] = _data[n*2]+_data[n*2+1];
}

int N, M;

int main()
{
	int i, a, b, c;

	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);

	scanf("%d %d", &N, &M);

	for(i = 1; i <= N; ++ i) {
		scanf("%d", &a);
		update(1, 1, N, i, i, a);
	}

	for(i = 0; i < M; ++ i) {
		scanf("%d %d %d", &a, &b, &c);
		if(a) {
			int tmp = query(1, 1, N, b, c);
			printf("%d\n", tmp);
		}
		else update(1, 1, N, b, b, -c);
	}

	return 0;
}