Skip to content

Instantly share code, notes, and snippets.

@kartikkukreja
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kartikkukreja/f53ac5dc9f6e5f106612 to your computer and use it in GitHub Desktop.
Save kartikkukreja/f53ac5dc9f6e5f106612 to your computer and use it in GitHub Desktop.
HORRIBLE query() and update()
SegmentTreeNode query(int stIndex, int start, int end) {
if (nodes[stIndex].start == start && nodes[stIndex].end == end) {
SegmentTreeNode result = nodes[stIndex];
if (result.hasPendingUpdate())
result.applyPendingUpdate();
return result;
}
int mid = (nodes[stIndex].start + nodes[stIndex].end) >> 1,
leftChildIndex = stIndex << 1,
rightChildIndex = leftChildIndex + 1;
SegmentTreeNode result;
if (start > mid)
result = query(rightChildIndex, start, end);
else if (end <= mid)
result = query(leftChildIndex, start, end);
else {
SegmentTreeNode leftResult = query(leftChildIndex, start, mid),
rightResult = query(rightChildIndex, mid+1, end);
result.start = leftResult.start;
result.end = rightResult.end;
result.merge(leftResult, rightResult);
}
if (nodes[stIndex].hasPendingUpdate()) {
result.addUpdate(nodes[stIndex].getPendingUpdate());
result.applyPendingUpdate();
}
return result;
}
void update(int stIndex, int start, int end, UpdateType value) {
if (nodes[stIndex].start == start && nodes[stIndex].end == end) {
nodes[stIndex].addUpdate(value);
return;
}
int mid = (nodes[stIndex].start + nodes[stIndex].end) >> 1,
leftChildIndex = stIndex << 1,
rightChildIndex = leftChildIndex + 1;
if (start > mid)
update(rightChildIndex, start, end, value);
else if (end <= mid)
update(leftChildIndex, start, end, value);
else {
update(leftChildIndex, start, mid, value);
update(rightChildIndex, mid+1, end, value);
}
nodes[stIndex].merge(nodes[leftChildIndex], nodes[rightChildIndex]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment