Cod sursa(job #798354)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 16 octombrie 2012 14:42:35
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
using namespace std;

int arbint[80000];

int u_pos, u_val;
int q_st, q_dr, q_result;

void query(int nod, int st, int dr) {
	if(q_st <= st && dr <= q_dr) {
		q_result += arbint[nod];
		return;
	}
	int mij = (st + dr) / 2;
	if(q_st <= mij) query(nod*2, st, mij);
	if(mij < q_dr) query(nod*2 + 1, mij+1, dr);
}

void update(int nod, int st, int dr) {
	if(st == dr) {
		arbint[nod] += u_val; 
		return;
	}
	int mij = (st + dr) / 2;
	if(u_pos <= mij) update(nod*2, st, mij);
	else update(nod*2 + 1, mij+1, dr);
	arbint[nod] = arbint[nod*2] + arbint[nod*2 + 1];
}

int main(void) {
	int n, m;
	ifstream fin("datorii.in");
	fin >> n >> m;
	for(int i = 1; i <= n; ++i) {
		int nr; fin >> nr;
		u_pos = i, u_val = nr;
		update(1, 1, n);
	}
	
	ofstream fout("datorii.out");
	for(int i = 0; i < m; ++i) {
		int op, a, b;
		fin >> op >> a >> b;
		if(op == 0) {
			u_val = -b, u_pos = a;
			update(1, 1, n);
		}
		else {
			q_st = a, q_dr = b, q_result = 0;
			query(1, 1, n);
			fout << q_result << '\n';
		}
		
	}		
	fin.close(); fout.close();
}