Cod sursa(job #2502224)

Utilizator maria_bMaria Burdila maria_b Data 30 noiembrie 2019 15:02:30
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 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;
}