Cod sursa(job #2403782)

Utilizator HumikoPostu Alexandru Humiko Data 11 aprilie 2019 20:58:30
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
//#include "pch.h"
#include <iostream>
#include <fstream>

using namespace std;

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

static const int NMAX = 15005;

int aint[4 * NMAX];

void update(int node, int left, int right, int position, int value) {
	if (left == right) {
		aint[node] += value;
		return;
	}

	int middle = left + (right - left) / 2;

	if (position <= middle) {
		update(2 * node, left, middle, position, value);
	}
	else {
		update(2 * node + 1, middle + 1, right, position, value);
	}

	aint[node] = aint[2 * node] + aint[2 * node + 1];
}

int query(int node, int left, int right, int a, int b) {
	if (left >= a && right <= b) {
		return aint[node];
	}

	int middle = left + (right - left) / 2;
	int ans = 0;

	if (middle >= a) {
		ans += query(2 * node, left, middle, a, b);
	}

	if ( middle < b ) {
		ans += query(2 * node + 1, middle + 1, right, a, b);
	}

	return ans;
}

int main() {
	ios::sync_with_stdio(false);
	fin.tie(0); fout.tie(0);

	int n, m;
	fin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		int x;
		fin >> x;

		update(1, 1, n, i, x);
	}

	for (int i = 1; i <= m; ++i) {
		int type, a, b;
		fin >> type;

		switch (type) {
		case 0:
			fin >> a >> b;
			update(1, 1, n, a, -b);
			break;

		case 1:
			fin >> a >> b;
			fout << query(1, 1, n, a, b)<< '\n';
		}
	}
}