Cod sursa(job #2974598)

Utilizator geezusIancur de Hunedoara geezus Data 4 februarie 2023 11:28:00
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <assert.h>
#include <funcitonal>

struct segment {
	const int left, right;
	segment(int l, int r) : left(l), right(r) {}
	segment(int l, int r, bool x) : segment(l, r) { assert(l < r); }
	inline const int mid() { return (right - left) / 2 + left; }
	inline const int size() { return right - left; }
	inline const bool isUnit() { return (right - left) == 1; }
	const std::pair<segment, segment> splitMid() {
		const int middle = mid();
		return { segment(left, middle), segment(middle, right) };
	}
};

typedef int T;
T store[], source[];

void build(const int id, const segment seg) {
	if(seg.isUnit()) {
		store[id] = source[l]; return;
	}
	const auto s = seg.splitMid();
	build(2 * id, s.first);
	build(2 * id + 1, s.second);
}


void modify(const int position, const int x, const int id, const segment seg) {
	store[id] += x - source[position];
	if(seg.isUnit()) {
		source[position] = x; return;
	}

	position < seg.mid() ? modify(positon, x, 2 * id, segment(seg.left, seg.mid())) :
		modify(positon, x, 2 * id + 1, segment(seg.mid(), seg.right));
}


T query(const segment target, const int id, const segment seg, std::funciton<T(T,T)>& op) {
	if(target.left >= seg.right || target.right <= seg.left) return;
	if(target.left <= seg.left && target.right >= seg.right) return store[id];
	const auto s = seg.splitMid();
	return op(query(target, id * 2, s.first, op), query(target, id * 2 + 1, s.second, op));
}


int main() {
	return 0;
}