Cod sursa(job #2903005)

Utilizator Rares_StefanoiuRares Stefanoiu Rares_Stefanoiu Data 17 mai 2022 00:47:49
Problema Datorii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<iostream>
#include<fstream>
using namespace std;
int arb[60000], x, n, m, i, a, b, op, suma, poz;

void adaug(int nod, int st, int dr, int poz) {
	if (st == dr)
	{
		arb[nod] = x;
		return;
	}
	int mid = (st + dr) / 2;
	if (poz <= mid)
		adaug(nod * 2, st, mid, poz);
	else
		adaug(nod * 2 + 1, mid + 1, dr, poz);
	arb[nod] = arb[2 * nod + 1]+ arb[2 * nod];


}

void scad(int nod, int st, int dr,int poz) {
	if (st == dr)
	{
		arb[nod]-=x;
		return;
	}
	int mid = (st + dr) / 2;
	if (poz <= mid)
		scad(nod * 2, st, mid, poz);
	else
		scad(nod * 2 + 1, mid + 1, dr, poz);
	arb[nod] = arb[2 * nod + 1] + arb[2 * nod];
}

void sum(int nod, int st, int dr) {
	if (a <= st && b >= dr)
		suma+=arb[nod];
	else {
		int mid=(st + dr) / 2;
		if (a <= mid)
			sum(2 * nod, st, mid);
		if (b > mid)
			sum(2 * nod + 1, mid + 1, dr);
	}
}

int main() {
	ifstream f("datorii.in");
	ofstream g("datorii.out");
	f >> n >> m;
	for (i = 1; i <= n; i++)
	{
		f >> x;
		adaug(1, 1, n, i);
	}
	for (i = 1; i <= m; i++) {
		f >> op;
		if(op==0)
		{
			f >> poz >> x;
			scad(1, 1, n, poz);
		}
		if (op == 1) {
			f >> a >> b;
			suma = 0;
			sum(1, 1, n);
			g << suma << "\n";
		}

	}
	return 0;
}