Cod sursa(job #2749522)

Utilizator LordNecrateBiowCuciureanu Dragos-Adrian LordNecrateBiow Data 6 mai 2021 23:20:24
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>
#include <math.h>
#include <vector>
#include <limits.h>

using namespace std;

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

int Arb[400005];
int op, start, finish, val, poz, s;

void modificare(int nod, int left, int right)
{
	if (left == right)
	{
		Arb[nod] -= val;
		return;
	}

	int mij = (left + right) / 2;
	if (poz <= mij)
		modificare(2 * nod, left, mij);
	else
		modificare(2 * nod + 1, mij + 1, right);

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

void determinare_suma(int nod, int left, int right)
{
	if (start <= left && right <= finish)
	{
		s += Arb[nod];
		return;
	}

	int mij = (left + right) / 2;
	if (start <= mij) 
		determinare_suma(2 * nod, left, mij);
	if (mij < finish) 
		determinare_suma(2 * nod + 1, mij + 1, right);
}

int main()
{
	int a, b, x, n, m;
	fin >> n >> m;

	for (int i = 1; i <= n; i++)
	{
		fin >> x;
		poz = i;
		val = -x;
		modificare(1, 1, n);
	}

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

		if (op == 0)
		{
			poz = a;
			val = b;
			modificare(1, 1, n);
		}
		else 
		{
			s = 0;
			start = a;
			finish = b;
			determinare_suma(1, 1, n);

			fout << s << "\n";
		}
	}

	return 0;
}