Cod sursa(job #2224403)

Utilizator DRLDRLRaul Ronald Galea DRLDRL Data 23 iulie 2018 21:41:49
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<iostream>
#include<fstream>


#define DIM  3*15000

using namespace std;

int bani[DIM], sumaRestanta;

void updateElemArboreIntervale(int nod, int st, int dr, int pozDeUpdate, int val) {
	if (st == dr) {
		bani[nod] = bani[nod] + val;
		return;
	}

	int mij = st + (dr - st) / 2;
	if (pozDeUpdate <= mij)
		updateElemArboreIntervale(2 * nod, st, mij, pozDeUpdate, val);
	else
		updateElemArboreIntervale(2 * nod + 1, mij + 1, dr, pozDeUpdate, val);
	bani[nod] = bani[2 * nod] + bani[2 * nod + 1];
}

void query(int nod, int st, int dr, int a, int b) {
	if (a <= st && b >= dr) {
		sumaRestanta = sumaRestanta + bani[nod];
		return;
	}

	int mij = st + (dr - st) / 2;
	if (a <= mij) {
		query(2 * nod, st, mij, a, b);
	}
	if (b > mij) {
		query(2 * nod + 1, mij + 1, dr, a, b);
	}

}


int main()
{


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

	int N, M, optiune, a, b, suma;
	fin >> N >> M;

	for (int i = 1; i <= N; i++) {
		fin >> suma;
		updateElemArboreIntervale(1, 1, N, i, suma);
	}

	for (int i = 1; i <= M; i++) {
		fin >> optiune;
		if (optiune) {
			fin >> a >> b;
			sumaRestanta = 0;
			query(1, 1, N, a, b);
			fout << sumaRestanta << "\n";
		}
		else {
			fin >> a >> b;
			updateElemArboreIntervale(1, 1, N, a, -b); // scadem cat s-a platit din datorie
		}
	}
	return 0;
}