Cod sursa(job #3270668)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 23 ianuarie 2025 23:03:41
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

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

#define MAXN 15005

int n, m;
vector<int> values;

class SegmentTree {
public:
	vector<int> tree;

	SegmentTree(const vector<int>& values) {
		int size = log2(values.size());
		size += (1 << size) < values.size();
		size = 1 << size;
		tree.resize(size * 2);
		Build(values, 1, size, 1);
	}

	int Query(int qLf, int qRg, int lf, int rg, int node) {
		if (lf >= qLf && rg <= qRg) {
			return tree[node];
		}

		int mid = lf + (rg - lf) / 2;
		int sum = 0;
		if (mid >= qLf) {
			sum += Query(qLf, qRg, lf, mid, LfSon(node));
		}
		if (mid < qRg) {
			sum += Query(qLf, qRg, mid + 1, rg, RgSon(node));
		}
		return sum;
	}

	void Update(int val, int pos, int lf, int rg, int node) {
		if (lf == rg) {
			tree[node] = val;
			return;
		}

		int mid = lf + (rg - lf) / 2; 
		if (mid >= pos) {
			Update(val, pos, lf, mid, LfSon(node));
		} else {
			Update(val, pos, mid + 1, rg, RgSon(node));
		}

		tree[node] = tree[LfSon(node)] + tree[RgSon(node)];
	}

private:
	void Build(const vector<int>& values, int lf, int rg, int node) {
		if (lf == rg) {
			if (lf >= values.size()) {
				return;
			}
			tree[node] = values[lf];
			return;
		}

		int mid = lf + (rg - lf) / 2;
		Build(values, lf, mid, LfSon(node));
		Build(values, mid + 1, rg, RgSon(node));

		tree[node] = tree[LfSon(node)] + tree[RgSon(node)];
	}

	int LfSon(int node) {
		return node * 2;
	}

	int RgSon(int node) {
		return node * 2 + 1;
	}
}; // class SegmentTree

void ReadData() {
	fin >> n >> m;
	values.resize(n + 1);
	for (int i = 1; i <= n; i++) {
		fin >> values[i];
	}
}

void Solve() {
	SegmentTree segTree = SegmentTree(values);

	int t, a, b;
	for (int i = 0; i < m; i++) {
		fin >> t >> a >> b;
		if (t == 0) {
			values[a] -= b;
			segTree.Update(values[a], a, 1, values.size(), 1);
		} else {
			fout << segTree.Query(a, b, 1, values.size(), 1) << '\n';
		}
	}
}

int main() {
	ReadData();
	Solve();
	return 0;
}