Cod sursa(job #3136354)

Utilizator alexlazuLazureanu Alexandru Ioan alexlazu Data 5 iunie 2023 23:46:36
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
#define inmat lin >= 1 && lin <= n && col >= 1 && col <= m

using namespace std;

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

const int N = 15e3;

int arb[N];

void build(int p , int st , int dr)
{
	if (st == dr) 
	{
		in >> arb[p];
		return;
	}
	int m = (st + dr) >> 1 , fs = 2*p , fd=2*p+1;
	build(fs, st, m);
	build(fd, m + 1, dr);
	arb[p] = arb[fs] + arb[fd];
}

int querry(int p , int st , int dr , int a , int b)
{
	if (a <= st && dr <= b)
	{
		return arb[p];
	}
	int m = (st + dr) >> 1,fs=2*p,fd=2*p+1,rez_st=0,rez_dr=0;
	if (a <= m)
	{
		rez_st = querry(fs, st, m, a, b);	
	}
	if (m + 1 <= b)
	{
		rez_dr = querry(fd, m + 1, dr, a, b);
	}
	return rez_st + rez_dr;
}

void update(int p , int st, int dr , int a , int b)
{
	if (st == dr)
	{
		arb[p] = arb[p] - b;
		return;
	}
	int m = (st + dr) >> 1, fs = 2 * p, fd = 2 * p + 1;
	if (a <= m)
	{
		update(fs, st, m, a, b);
	}
	else
	{
		update(fd, m+1, dr, a, b);
	}
	arb[p] = arb[fs] + arb[fd];
}

int n, m;

void read()
{
	in >> n >> m;
	build(1,1,n);
	int task, a, b;
	for (int i = 1; i <= m; i++)
	{
		in >> task >> a >> b;
		if (task == 0)
		{
			update(1, 1, n, a, b);
		}
		else
		{
			out << querry(1, 1, n, a, b) << '\n';
		}
	}
}

int main()
{
	read();
}