Pagini recente » Cod sursa (job #403860) | Cod sursa (job #386838) | Cod sursa (job #164063) | Cod sursa (job #365599) | Cod sursa (job #2974583)
#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;
}