Cod sursa(job #1443329)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 27 mai 2015 18:13:12
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>
#include <vector>
using namespace std;

class arbore_segmente{
	int sz;
	vector<int> v;
public:
	arbore_segmente(const int Sz, ifstream& f):
		sz(Sz),
		v(2*sz){
		for(int i = sz; i < 2*sz; ++i){
			f >> v[i]; }
		for(int i = sz-1; i > 0; --i){
			v[i] = v[2*i] + v[2*i+1]; } }
	void update(int poz, const int delta){
		poz += sz-1;
		v[poz] += delta;
		for( ; poz > 1; poz /= 2){
			v[poz/2] = v[poz] + v[poz^1]; } }
	int query(int st, int dr){
		st += sz-1, dr += sz-1;
		int rez = 0;
		for( ; st < dr; st /= 2, dr /= 2){
			if(st&1){
				rez += v[st++]; }
			if(dr&1){
				rez += v[--dr]; } }
		return rez; } };

int main(){
	ifstream f("datorii.in");
	ofstream g("datorii.out");
	int n, m;
	f >> n >> m;
	arbore_segmente arb(n, f);
	for(int i = 0, t, a, b; i < m; ++i){
		f >> t >> a >> b;
		switch(t){
		case 0:
			arb.update(a, -b);
			break;
		case 1:
			g << arb.query(a, b+1) << '\n';
			break; } }
	return 0; }