Cod sursa(job #1505356)

Utilizator DacianBocea Dacian Dacian Data 19 octombrie 2015 01:10:10
Problema Datorii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
using namespace std;//test aint
int ARB[200000], N, M, a, b, c, pos, val, max1 = 0, start, finish;
void update(int nod, int left, int right){
	if (left == right){
		if (a==-1)ARB[nod] = val;
		else if (!a) ARB[nod] -= val;
	}
	else{
		int  m = (left + right) / 2;
		if (pos <= m)update(2 * nod, left, m);
		else update(2 * nod + 1, m + 1, right);
		ARB[nod] = ARB[2 * nod] + ARB[2 * nod + 1];
	}
}
void q(int nod, int left, int right){
	if (start <= left && right <= finish) max1 += ARB[nod];
	else{
		int m = (left + right) / 2;
		if (start <= m) q(2 * nod, left, m);
		if (m < finish) q(2 * nod + 1, m + 1, right);
	}
}
int main(){
	ofstream of("datorii.out");
	ifstream f("datorii.in");
	f >> N >> M;
	a = -1;
	for (int i = 1; i <= N; ++i){
		f >> val;
		pos = i;
		update(1, 1, N);
	}
	for (int i = 0; i < M; ++i){
		f >> a >> b >> c;
		if (a == 0){
			pos = b; val = c;
			update(1, 1, N);
		}
		else{
			start = b; finish = c;
			max1 = 0;
			q(1, 1, N);
			of << max1 << "\n";
		}
	}
}