Cod sursa(job #3240246)

Utilizator EricDimiericdc EricDimi Data 13 august 2024 13:59:13
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#define DIM 15000

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

int A[4 * DIM + 1];
int N, M, op, a, b;

void build(int node, int left, int right)
{
	if (left == right)
		f >> 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 update(int node, int left, int right, int pos, int value)
{
	if (left == right)
		A[node] -= value;
	else
	{
		int mid = (left + right) / 2;
		if (pos <= mid)
			update(node * 2, left, mid, pos, value);
		if (mid + 1 <= pos)
			update(node * 2 + 1, mid + 1, right, pos, value);
		A[node] = A[node * 2] + A[node * 2 + 1];
	}
}

int query(int node, int left, int right, int a, int b)
{
	if (a <= left && right <= b)
		return A[node];
	else
	{
		int mid = (left + right) / 2;

		if (b <= mid)
			return query(node * 2, left, mid, a, b);
		if (mid + 1 <= a)
			return query(node * 2 + 1, mid + 1, right, a, b);
		return query(node * 2, left, mid, a, b) + query(node * 2 + 1, mid + 1, right, a, b);
	}
}

int main()
{
	f >> N >> M;
	build(1, 1, N);
	while (M--)
	{
		f >> op >> a >> b;
		if (op == 0)
			update(1, 1, N, a, b);
		else
			g << query(1, 1, N, a, b) << '\n';
	}
    f.close();
    g.close();
    return 0;
}