Cod sursa(job #1850257)

Utilizator tonisnakesBoar Antonio tonisnakes Data 18 ianuarie 2017 13:57:50
Problema Datorii Scor 100
Compilator cpp Status done
Runda gym_emag_avansati_2016 Marime 1.33 kb
#include <iostream>
#include <fstream>
#define NMAX 60005
using namespace std;

ifstream fin ("datorii.in");
ofstream fout ("datorii.out");

int n, m, a[NMAX];

void build (int node, int left, int right) {
	if (left == right) {
		fin >> a[node];
	}
	else {
		int mid = (left + right) / 2;
		build(node * 2, left, mid);
		build(node * 2 + 1, mid+1, right);
		a[node] = a[node * 2] + a[node * 2 + 1];
	}
}

void reduce (int node, int left, int right, int poz, int val) {
	if (left == right && left == poz) {
		a[node] -= val;
	}
	else {
		int mid = (left + right) / 2;
		if (poz <= mid) {
			reduce(node * 2, left, mid, poz, val);
		}
		else {
			reduce(node * 2 + 1, mid + 1, right, poz, val);
		}
		a[node] = a[node * 2] + a[node * 2 + 1];
	}
}

int query (int node, int left, int right, int x, int y) {
	if (x <= left && right <= y) {
		return a[node];
	}
	else {
		int mid = (left + right) / 2;
		if (mid < x) {
			return query(node * 2 + 1, mid+1, right, x, y);
		}
		else
		if (y <= mid) {
			return query(node * 2, left, mid, x, y);
		}
		return (query(node *2, left, mid, x, y) + query(node * 2 + 1, mid+1, right, x, y));
	}
}

int main () 
{
	fin >> n >> m;
	build(1,1,n);
	int p, x, y;
	for (int t = 1; t <= m; ++t) {
		fin >> p >> x >> y;
		if (p == 0) {
			reduce(1,1,n,x,y);
		}
		else {
			fout << query(1,1,n,x,y) << '\n';
		}
	}
	
	return 0;
}