Cod sursa(job #2972634)

Utilizator mati.coldea@gmail.comMatei Coldea [email protected] Data 29 ianuarie 2023 21:24:03
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <bits/stdc++.h>


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


vector<int> segm_tree(50005);
vector<int> val(15005);



void build(int node, int left, int right) {

	if (left == right) {
		segm_tree[node] = val[left];
	}
	else {
		int mij = (left + right) / 2;

		build(node * 2, left, mij);
		build(node * 2 + 1, mij+1, right);

		segm_tree[node] = (segm_tree[node * 2]+ segm_tree[node * 2 + 1]);
	}



}

void update(int node, int left, int right, int pos, int new_val) {
	if (left == right) {
		segm_tree[node] -= new_val;
	}
	else {
		int mij = (left + right) / 2;

		if (pos <= mij) {
			update(node*2,left,mij,pos,new_val);
		}
		else {
			update(node * 2+1, mij+1, right, pos, new_val);

		}
		segm_tree[node] = (segm_tree[node * 2]+ segm_tree[node * 2 + 1]);

	}
}


int query(int node, int left, int right, int left_q, int right_q) {

	if (left_q <= left && right <= right_q) {
		return segm_tree[node];
	}
	else {
		int mij = (left + right) / 2;

		if (right_q <= mij) {
			return query(node * 2, left, mij, left_q, right_q);
		}
		if(mij+1<=left_q) {
			return query(node * 2 + 1, mij + 1, right, left_q, right_q);

		}
		return (query(node * 2, left, mij, left_q, right_q)+query(node * 2 + 1, mij + 1, right, left_q, right_q));
	}


}




int main() {



	int n, m;
	fin >> n>>m ;
	

	for (int i = 1; i <= n; i++) {
		fin >> val[i];
	}

	build(1, 1, n);
	int t,a ,b;
	for (int i = 1; i <= m; i++) {
		fin >> t;

		if (t == 1) {
			fin >> a >> b;
			fout << query(1, 1, n, a, b)<<'\n';
		}
		else {
			fin >> a >> b;
			update(1, 1, n , a, b);
		}
	}





	return 0;

}