Cod sursa(job #2628260)

Utilizator dream3rDavid Pop dream3r Data 15 iunie 2020 11:45:23
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
//#include "pch.h"
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <climits>
#include <queue>
#define ll long long int
#define nr 170005
using namespace std;
ifstream f("datorii.in");
ofstream o("datorii.out");
constexpr int DIM = 15001;

int v[DIM];

int arb[4 * DIM];

void build(int poz, int l, int r)
{
	if (l == r)
	{
		arb[poz] = v[l];
		return;
	}

	int mid = (l + r) / 2;

	build(2 * poz, l, mid);
	build(2 * poz + 1, mid + 1, r);

	arb[poz] = arb[poz * 2] + arb[poz * 2 + 1];

}

void update(int poz, int l, int r, int loc, int val)
{
	if (l == r)
	{
		arb[poz] = val;
		return;
	}

	int mid = (l + r) / 2;

	if (loc <= mid)
		update(poz * 2, l, mid, loc, val);
	else
		update(poz * 2 + 1, mid + 1, r, loc, val);

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

int query(int poz, int l, int r, int st, int dr)
{
	if (st <= l && r <= dr)
		return arb[poz];

	int rez = 0;

	int mid = (l + r) / 2;

	if (st <= mid)
		rez = rez + query(poz * 2, l, mid, st, dr);

	if (mid + 1 <= dr)
		rez = rez + query(poz * 2 + 1, mid + 1, r, st, dr); \

		return rez;

}


int main()
{
	int n, m;
	f >> n >> m;

	for (int i = 1; i <= n; i++)
		f >> v[i];

	build(1, 1, n);

	for (int i = 1; i <= m; i++)
	{
		int q, x, y;
		f >> q >> x >> y;

		if (q == 0)
		{
			v[x] -= y;
			update(1, 1, n, x, v[x]);
		}
		else
		{
			o << query(1, 1, n, x, y) << '\n';
		}

	}

}