Cod sursa(job #2750753)

Utilizator vali_27Bojici Valentin vali_27 Data 13 mai 2021 08:52:35
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>

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

int arb[15000 * 4], n;

void create(int nod, int st, int dr)
{
	// creez in O(n)
	if (st == dr)
	{
		fin >> arb[nod];
	}
	else
	{
		int mid = st + (dr - st) / 2;
		create(nod * 2 + 1, st, mid);
		create(nod * 2 + 2, mid + 1, dr);
		arb[nod] = arb[nod * 2 + 1] + arb[nod * 2 + 2];
	}
}

void update(int nod, int st, int dr, int poz, int val)
{
	if (st == dr)
	{
		arb[nod] -= val;
	}
	else
	{
		int mid = st + (dr - st) / 2;
		if (poz <= mid)
		{
			update(nod * 2 + 1, st, mid, poz, val);
		}
		else
		{
			update(nod * 2 + 2, mid + 1, dr, poz, val);
		}

		arb[nod] = arb[nod * 2 + 1] + arb[nod * 2 + 2];
	}
}


void query(int nod, int st, int dr, int x, int y, int& rez)
{
	if (st >= x && dr <= y)
		rez += arb[nod];
	else
	{
		int mid = st + (dr - st) / 2;
		if (mid >= x)
			query(nod * 2 + 1, st, mid, x, y, rez);
		if (mid < y) // mid+1 <= y
			query(nod * 2 + 2, mid + 1, dr, x, y, rez);
	}
}


int main()
{
	int n, m, tip, x, y;
	fin >> n >> m;
	create(0, 0, n - 1);

	for (int i = 0; i < m; ++i)
	{
		fin >> tip >> x >> y;
		if (tip == 0)
			update(0, 0, n - 1, x-1, y); // -1 ca e indexat de la 0
		else
		{
			int rez = 0;
			query(0, 0, n - 1, x-1, y-1, rez);
			fout << rez << '\n';
		}
	}
}