Cod sursa(job #827132)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 1 decembrie 2012 17:36:49
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>

#define fs (node << 1)
#define fd ((node << 1) + 1)

int aint[1 << 15];
int n, m;

void update(int node, int lf, int rt, int val, int poz) {
	if(lf == rt) {
		aint[node] += val;
		return ;
	}
	int mid = (lf + rt) >> 1;
	
	if(poz <= mid) update(fs, lf, mid, val, poz);
	if(poz > mid)  update(fd, mid + 1, rt, val, poz);

	aint[node] = aint[fs] + aint[fd];
}
int sol = 0;

void query(int node, int lf, int rt, int a, int b) {
	if(a <= lf && b >= rt) {
		sol += aint[node];
		return ;
	}
	int mid = (lf + rt) >> 1;
	if(a <= mid) query(fs, lf, mid, a, b);
	if(b > mid) query(fd, mid + 1, rt, a, b);
}
int main() {
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	
	int t, x, y;
	scanf("%d %d\n", &n, &m);
	for(int i = 1; i <= n; ++i) {
		
		scanf("%d", &x);
		update(1, 1, n, x, i);
	}

	while(m--) {
		scanf("%d %d %d", &t, &x, &y);
		if(t == 0) 
			update(1, 1, n, -y, x);
		else {	
			sol = 0;
			query(1, 1, n, x, y);
			printf("%d\n", sol);
		}
	}
	return 0;
}