Cod sursa(job #3143623)

Utilizator daristyleBejan Darius-Ramon daristyle Data 31 iulie 2023 20:50:17
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>

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

const int N_MAX = 15e3;
const int SEGMENT_TREE_DIM = 2 * N_MAX;

template<typename T>
class SegmentTree{
private:
		T segmentTree[SEGMENT_TREE_DIM];

public:

		void build(int node, int left, int right, ifstream& fin){
			if(left == right){
				T x;
				fin >> x;
				segmentTree[node] = x;
			}else{
				int middle = (left + right) / 2;
				int leftChild = node + 1;
				int rightChild = node + 2 * (middle - left + 1);
				build(leftChild, left, middle, fin);
				build(rightChild, middle + 1, right, fin);
				segmentTree[node] = segmentTree[leftChild] + segmentTree[rightChild];
			}
		}

		void update(int node, int left, int right, int pos, T val){
			if(left == right)
				segmentTree[node] += val;
			else{
				int middle = (left + right) / 2;
				int leftChild = node + 1;
				int rightChild = node + 2 * (middle - left + 1);
				if(pos <= middle)
					update(leftChild, left, middle, pos, val);
				else
					update(rightChild, middle + 1, right, pos, val);
				segmentTree[node] = segmentTree[leftChild] + segmentTree[rightChild];
			}
		}

		T query(int node, int left, int right, int qleft, int qright){
			T retval{};

			if(left >= qleft && right <= qright)
				retval = segmentTree[node];
			else{
				int middle = (left + right) / 2;
				int leftChild = node + 1;
				int rightChild = node + 2 * (middle - left + 1);
				if(qleft <= middle)
					retval += query(leftChild, left, middle, qleft, qright);
				if(middle + 1 <= qright)
					retval += query(rightChild, middle + 1, right, qleft, qright);
			}

			return retval;
		}
};

SegmentTree<int> segtree;

int main(){
	int n, queries;
	fin >> n >> queries;

	segtree.build(0, 0, n - 1, fin);

	for(int i = 0; i < queries; ++i){
		int type, a, b;
		fin >> type >> a >> b;

		if(type)
			fout << segtree.query(0, 0, n - 1, a - 1, b - 1) << '\n';
		else
			segtree.update(0, 0, n - 1, a - 1, -b);
	}

	fin.close();
	fout.close();
	return 0;
}