Cod sursa(job #527534)

Utilizator iulia609fara nume iulia609 Data 31 ianuarie 2011 20:22:08
Problema Datorii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#define dim 15001
using namespace std;
int A[5*dim], suma; 

void update(int nod, int st, int dr, int pos, int val)
{ int mij;

	if(st == dr) { A[nod] -= val; return;}
	
	mij = (st + dr) / 2;
	if(pos <= mij) update(nod*2, st, mij, pos, val);
	 else if(pos > mij) update(nod*2 +1, mij+1, dr, pos, val);
	
	A[nod] = A[nod*2] + A[nod*2+1];
}


void query(int nod, int st, int dr, int a, int b)
{ int mij;
	
	if((a <= st) && (dr <= b)) {
		suma += A[nod];
		return;
	}
	
	mij = (st + dr) /2;
	if(a <= mij) query(nod*2, st, mij, a, b);
	if(b > mij) query(nod*2+1, mij+1, dr, a, b);
}


int main()
{	int N, M, i, x, a, b, y;
	
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	
	scanf("%d %d", &N, &M);
	
	for(i = 1; i <= N; i++){
		scanf("%d", &x);
		y = -x;
		update(1, 1, N, i, y);
	}
	
	for(i = 1; i <= M; i++){
		scanf("%d %d %d", &x, &a, &b);
		
		if(x == 1){
			suma = 0;
			query(1, 1, N, a, b);
			printf("%d\n", suma);
		}
		
		else if(x == 0){
			update(1, 1, N, a, b);
		}
	}
	
	return 0;
}