Cod sursa(job #964791)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 22 iunie 2013 13:11:48
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
using namespace std;

#define init m = (l + r)/2, L = n << 1, R = L | 1
#define NMAX 15001

int H[3 * NMAX];
int A[NMAX];

inline void update (int n, int l, int r, int p, int v){
    if (l == r){H[n] -= v; return;}
    int init;
    if (p <= m) update (L, l, m, p, v);
    else
        update (R, m + 1, r, p, v);
    H[n] = H[L] + H[R];
}

inline int query (int n, int l, int r, int i, int j){
    if (i <= l && r <= j) return H[n];
    int m = (l + r) / 2; int sol = 0;
    if (i <= m) sol = sol + query(2 * n, l, m, i, j);
    if (j > m) sol = sol + query(2 * n + 1, m + 1, r, i, j);
    return sol;
}

void build (int n, int l, int r){
    if (l == r){H[n] = A[l]; return;}
    int init;
    build (L, l, m);
    build (R, m + 1, r);
    H[n] = H[R] + H[L];
}

int i, N, M;
int T, V, op;
int P, Q;

int main() {
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%i%i", &N, &M);
	for (i = 1; i <= N; ++i) 
		scanf("%i", &A[i]);
	build(1, 1, N);
	for (i = 1; i <= M; ++i) {
		scanf("%i", &op);
		if (!op) {
			scanf("%i%i", &T, &V);
			update(1, 1, N, T, V);
		}
		else {
			scanf("%i%i", &P, &Q);
			printf("%i\n", query(1, 1, N, P, Q));
		}
	}
	return 0;
}