Cod sursa(job #2606762)

Utilizator michael_blazemihai mihai michael_blaze Data 28 aprilie 2020 15:41:56
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <cmath>

#define max(a, b) ((a > b) ? (a) : (b))
#define MAX 100005

using namespace std;

int arr[MAX], n, m;
int arbore[4 * MAX + 1];
int a, b;

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

void init(int left, int right, int son) {
	if (left == right) {
		arbore[son] = arr[left];
		return;
	}
	int mid = (left + right) / 2;
	init(left, mid, 2 * son);
	init(mid + 1, right, 2 * son + 1);
	arbore[son] = arbore[2 * son] + arbore[2 * son + 1];
}

void update(int left, int right, int son) {
	if (left == right) {
		arbore[son] -= b;
		arr[left] -= b;
		return; 
	}
	int mid = (left + right) / 2;
	if (a <= mid)
		update(left, mid, 2 * son);
	else
		update(mid + 1, right, 2 * son + 1);
	arbore[son] = arbore[2 * son] +  arbore[2 * son + 1];
}

int getSum(int left, int right, int son) {
	if (left >= a and right <= b)
		return arbore[son];

	int mid = (left + right) / 2;
	int sum = 0;
	if (a <= mid)
		sum += getSum(left, mid, 2 * son);
	if (b >= mid + 1)
		sum += getSum(mid + 1, right, 2 * son + 1);
	return sum;
}

int main() {
	int x;
	fin >> n >> m;
	
	for (int i = 1;i <= n;i ++) {
		fin >> arr[i];
	}

	init(1, n, 1);

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

		if (!operation) {
			update(1, n, 1);
		}
		else {
			fout << getSum(1, n, 1) << '\n';
		}
	}

	return 0;
}