Cod sursa(job #1606900)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 20 februarie 2016 17:38:10
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("datorii.in");
ofstream cout("datorii.out");
int N, M, ARB[70100], A, B, rs, a[15001];
void update(int left, int right, int nod, int val, int poz){
	if(left == right) ARB[nod] = val;
		else{
			int pivot = (left + right)/2;
			if(poz <= pivot) update(left, pivot, 2*nod, val, poz);
				else update(pivot+1, right, 2*nod + 1, val ,poz);
			ARB[nod] = ARB[2*nod] + ARB[2*nod+1];
			}
}
void achitare(int left, int right, int nod, int val, int poz){
	if(left == right) ARB[nod] -= val;
		else{
			int pivot = (left + right)/2;
			if(poz <= pivot) achitare(left, pivot, 2*nod, val, poz);
				else achitare(pivot+1, right, 2*nod + 1, val ,poz);
			ARB[nod] = ARB[2*nod] + ARB[2*nod+1];
			}
	}
void query(int left, int right, int nod, int x, int y){
	if(left >= x && right <= y) rs += ARB[nod];
		else {
			int pivot = (left+right)/2;
			if(x <= pivot) query(left, pivot, 2*nod, x, y);
			if(y > pivot) query(pivot+1, right, 2*nod + 1, x, y);
			}
}
int main(){
	cin >> N >> M;
	for(int i = 1; i <= N; i++){
		cin >> a[i];
		update(1,N,1,a[i],i);
	}
	for(int i = 1; i <= M; i++){
		int X;
		cin >> X >> A >> B;
		if(X == 0){
			achitare(1, N, 1, B, A);
			}
		else{ 
			rs = 0;
			query(1, N, 1, A, B);
			cout << rs << '\n';
			}
		}
	return 0;
}