Cod sursa(job #2007382)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 2 august 2017 16:55:21
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#define DM 15005
#include <fstream>
using namespace std;

ifstream fi ("datorii.in");
ofstream fo ("datorii.out");
int n, m, v[DM], sgt[4*DM], a, b, c;

void build(int nod, int st, int dr)
{
	if (st == dr)
		sgt[nod] = v[st];
	else
	{
		int mid = (st + dr)/2, nods = nod*2;
		build(nods + 1, mid + 1, dr);
		build(nods, st, mid);
		sgt[nod] = sgt[nods] + sgt[nods+1];
	}
}

void update(int nod, int st, int dr, int pos, int val)
{
	if (st == dr)
	{
		sgt[nod]-= val;
		return;
	}
	int mid = (st + dr)/2, nods = nod*2;
	if (pos > mid)
		update(nods + 1, mid + 1, dr, pos, val);
	else
		update(nods, st, mid, pos, val);
	sgt[nod] = sgt[nods] + sgt[nods+1];
}

int get_sum(int nod, int st, int dr, int a, int b)
{
	if (st >= a && dr <= b)
		return sgt[nod];
	if (a > dr || b < st)
		return 0;
	int mid = (st + dr)/2, nods = nod*2;
	return (get_sum(nods, st, mid, a, b) + get_sum(nods + 1, mid + 1, dr, a, b));
}

int main()
{
	fi >> n >> m;
	for (int i = 1; i <= n; ++i)
		fi >> v[i];
	build(1, 1, n);
	for (int i = 1; i <= m; ++i)
	{
		fi >> c >> a >> b;
		if (c)
			fo << get_sum(1, 1, n, a, b) << '\n';
		else
			update(1, 1, n, a, b);
	}
	return 0;
}