Cod sursa(job #1077102)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 10 ianuarie 2014 21:39:47
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<cstdio>
#include<vector>

using namespace std;

int N, M;
vector<int> V(15000 * 3);

void read();
void solve();
void addTree(int node, int left, int right, int pos, int value);
int sumTree(int node, int left, int right, int A, int B);

int main() {
	//freopen("input.txt", "r", stdin);
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	read();
	solve();
	//while (1);
	return 0;
}

void read() {
	int x, i;
	scanf("%d %d", &N, &M);
	for (i = 1; i <= N; ++i) {
		scanf("%d", &x);
		addTree(1, 1, N, i, x);
	}
}

void solve() {
	int i, c, A, B, x;
	for (i = 1; i <= M; ++i) {
		scanf("%d %d %d", &c, &A, &B);
		if (c == 0) {
			addTree(1, 1, N, A, -B);
		}
		else {
			x = sumTree(1, 1, N, A, B);
			printf("%d\n", x);
		}
	}
}

void addTree(int node, int left, int right, int pos, int value) {
	if (left == right && left == pos) {
		V[node] += value;
		return ;
	}
	int mid;
	mid = (left + right) / 2;
	if (pos <= mid) {
		addTree(node * 2, left, mid, pos, value);
	}
	else {
		addTree(node * 2 + 1, mid + 1, right, pos, value);
	}
	V[node] = V[node * 2] + V[node * 2 + 1];
}

int sumTree(int node, int left, int right, int A, int B) {
	if (A <= left && right <= B){
		return V[node];
	}
	int mid, s1 = 0, s2 = 0;
	mid = (left + right) / 2;
	if (A <= mid) {
		s1 = sumTree(node * 2, left, mid, A, B);
	}
	if (mid < B) {
		s2 = sumTree(node * 2 + 1, mid + 1, right, A, B);
	}
	return s1 + s2; 
}