Cod sursa(job #2902979)

Utilizator Bogdan197Putineanu Bogdan Bogdan197 Data 16 mai 2022 23:47:13
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <algorithm>
#include <iostream>

using namespace std;

int valori[15010];
int arb_int[60040];

void buildtree(int node, int left, int right)
{

	if (left == right)
		arb_int[node] = valori[left];
	else
	{
		int middle = (left + right) / 2;
		buildtree(node * 2, left, middle);
		buildtree(node * 2 + 1, middle + 1, right);
		arb_int[node] = arb_int[node * 2] + arb_int[node * 2 + 1];
	}
}

int getsum(int node, int tree_left, int tree_right, int interval_left, int interval_right)
{
	if (tree_left > tree_right)
		return 0;
	if (tree_left > interval_right || tree_right < interval_left)		
		return 0;
	if (tree_left >= interval_left && tree_right <= interval_right)
		return arb_int[node];
	int middle = (tree_left + tree_right) / 2;
	return getsum(node * 2, tree_left, middle, interval_left, interval_right) + getsum(node * 2 + 1, middle + 1, tree_right, interval_left, interval_right);
}

void update(int node, int position, int value, int tree_left, int tree_right)
{
	arb_int[node] -= value;
	if (tree_left == tree_right)
		return;
	int middle = (tree_left + tree_right) / 2;
	if (position <= middle)
		update(node * 2, position, value, tree_left, middle);
	else
		update(node * 2 + 1, position, value, middle + 1, tree_right);
}

int main()
{
	ifstream f("datorii.in");
	ofstream g("datorii.out");
	int nr_elemente, nr_operatii, tip_operatie;
	f >> nr_elemente >> nr_operatii;
	for (int i = 1; i <= nr_elemente; i++)
		f >> valori[i];
	
	buildtree(1, 1, nr_elemente);
	int interval_left, interval_right, poz, val;
	for (int i = 0; i < nr_operatii; i++)
	{
		f >> tip_operatie;
		if (tip_operatie == 1)
		{
			f >> interval_left >> interval_right;
			g << getsum(1, 1, nr_elemente, interval_left, interval_right) << "\n";
		}
		else
		{
			f >> poz >> val;
			update(1, poz, val, 1, nr_elemente);
		}
	}
}