#include <cstdio>
#include <cmath>
using namespace std;
struct SegmentTreeNode {
int start, end; // this node is responsible for the segment [start...end]
int total;
void assignLeaf(int value) {
total = value;
}
void merge(SegmentTreeNode& left, SegmentTreeNode& right) {
total = left.total + right.total;
}
int query() {
return total;
}
int getValue() {
return total;
}
// the value of the update is dummy in this case
void applyUpdate(int value) {
total = total+value;
}
};
template<class InputType, class UpdateType, class OutputType>
class SegmentTree {
SegmentTreeNode* nodes;
int N;
public:
SegmentTree(InputType arr[], int N) {
this->N = N;
nodes = new SegmentTreeNode[getSegmentTreeSize(N)];
buildTree(arr, 1, 0, N-1);
}
~SegmentTree() {
delete[] nodes;
}
// get the value associated with the segment [start...end]
OutputType query(int start, int end) {
SegmentTreeNode result = query(1, start, end);
return result.query();
}
// range update: update the range [start...end] by value
// Exactly what is meant by an update is determined by the
// problem statement and that logic is captured in segment tree node
void update(int start, int end, UpdateType value) {
update(1, start, end, value);
}
OutputType update(int index, OutputType value) {
update(1, 0, N-1, index, value);
}
OutputType getValue(int lo, int hi) {
SegmentTreeNode result = getValue(1, 0, N-1, lo, hi);
return result.getValue();
}
private:
void update(int stIndex, int lo, int hi, int index, OutputType value) {
if (lo == hi) {
nodes[stIndex].applyUpdate(value);
return;
}
int left = 2 * stIndex, right = left + 1, mid = (lo + hi) / 2;
if (index <= mid)
update(left, lo, mid, index, value);
else
update(right, mid+1, hi, index, value);
nodes[stIndex].merge(nodes[left], nodes[right]);
}
void buildTree(InputType arr[], int stIndex, int start, int end) {
// nodes[stIndex] is responsible for the segment [start...end]
nodes[stIndex].start = start, nodes[stIndex].end = end;
if (start == end) {
// a leaf node is responsible for a segment containing only 1 element
nodes[stIndex].assignLeaf(arr[start]);
return;
}
int mid = (start + end) / 2,
leftChildIndex = 2 * stIndex,
rightChildIndex = leftChildIndex + 1;
buildTree(arr, leftChildIndex, start, mid);
buildTree(arr, rightChildIndex, mid + 1, end);
nodes[stIndex].merge(nodes[leftChildIndex], nodes[rightChildIndex]);
}
int getSegmentTreeSize(int N) {
int size = 1;
for (; size < N; size <<= 1);
return size << 1;
}
SegmentTreeNode query(int stIndex, int start, int end) {
if (nodes[stIndex].start == start && nodes[stIndex].end == end)
return nodes[stIndex];
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);
}
return result;
}
void update(int stIndex, int start, int end, UpdateType value) {
if (start == end) {
// we are only applying updates on leaf nodes
nodes[stIndex].applyUpdate(value);
return;
}
int mid = (nodes[stIndex].start + nodes[stIndex].end) / 2,
leftChildIndex = 2 * stIndex,
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]);
}
};
int A[100005];
int main() {
int N, Q, i, queryType, a, b,v,t;
scanf("%d",&t);
while(t--){
scanf("%d %d", &N, &Q);
for (i = 0; i < N; ++i)
A[i]=0;
SegmentTree<int,int,int> tree(A, N);
while (Q--) {
scanf("%d%d%d", &queryType, &a, &b);
if (queryType == 0){
scanf("%d",&v);
//this works
for(int i=a-1;i<=b-1;i++)
tree.update(i,v);
//this gives wrong answer
// tree.update(a-1,b-1,v);
}
else{
printf("%d\n", tree.query(a-1, b-1));
}
}
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNtYXRoPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFNlZ21lbnRUcmVlTm9kZSB7CiAgICBpbnQgc3RhcnQsIGVuZDsgLy8gdGhpcyBub2RlIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc2VnbWVudCBbc3RhcnQuLi5lbmRdCiAgICBpbnQgdG90YWw7CgogICAgdm9pZCBhc3NpZ25MZWFmKGludCB2YWx1ZSkgewogICAgICAgIHRvdGFsID0gdmFsdWU7CiAgICB9CgogICAgdm9pZCBtZXJnZShTZWdtZW50VHJlZU5vZGUmIGxlZnQsIFNlZ21lbnRUcmVlTm9kZSYgcmlnaHQpIHsKICAgICAgICB0b3RhbCA9IGxlZnQudG90YWwgKyByaWdodC50b3RhbDsKICAgIH0KCiAgICBpbnQgcXVlcnkoKSB7CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgfQogICAgaW50IGdldFZhbHVlKCkgewogICAgICAgIHJldHVybiB0b3RhbDsKICAgIH0KCiAgICAvLyB0aGUgdmFsdWUgb2YgdGhlIHVwZGF0ZSBpcyBkdW1teSBpbiB0aGlzIGNhc2UKICAgIHZvaWQgYXBwbHlVcGRhdGUoaW50IHZhbHVlKSB7CiAgICAgICAgdG90YWwgPSB0b3RhbCt2YWx1ZTsKICAgIH0KfTsKCnRlbXBsYXRlPGNsYXNzIElucHV0VHlwZSwgY2xhc3MgVXBkYXRlVHlwZSwgY2xhc3MgT3V0cHV0VHlwZT4KY2xhc3MgU2VnbWVudFRyZWUgewogICAgU2VnbWVudFRyZWVOb2RlKiBub2RlczsKICAgIGludCBOOwoKcHVibGljOgogICAgU2VnbWVudFRyZWUoSW5wdXRUeXBlIGFycltdLCBpbnQgTikgewogICAgICAgIHRoaXMtPk4gPSBOOwogICAgICAgIG5vZGVzID0gbmV3IFNlZ21lbnRUcmVlTm9kZVtnZXRTZWdtZW50VHJlZVNpemUoTildOwogICAgICAgIGJ1aWxkVHJlZShhcnIsIDEsIDAsIE4tMSk7CiAgICB9CgogICAgflNlZ21lbnRUcmVlKCkgewogICAgICAgIGRlbGV0ZVtdIG5vZGVzOwogICAgfQoKICAgIC8vIGdldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWdtZW50IFtzdGFydC4uLmVuZF0KICAgIE91dHB1dFR5cGUgcXVlcnkoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgU2VnbWVudFRyZWVOb2RlIHJlc3VsdCA9IHF1ZXJ5KDEsIHN0YXJ0LCBlbmQpOwogICAgICAgIHJldHVybiByZXN1bHQucXVlcnkoKTsKICAgIH0KCiAgICAvLyByYW5nZSB1cGRhdGU6IHVwZGF0ZSB0aGUgcmFuZ2UgW3N0YXJ0Li4uZW5kXSBieSB2YWx1ZQogICAgLy8gRXhhY3RseSB3aGF0IGlzIG1lYW50IGJ5IGFuIHVwZGF0ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZQogICAgLy8gcHJvYmxlbSBzdGF0ZW1lbnQgYW5kIHRoYXQgbG9naWMgaXMgY2FwdHVyZWQgaW4gc2VnbWVudCB0cmVlIG5vZGUKICAgIHZvaWQgdXBkYXRlKGludCBzdGFydCwgaW50IGVuZCwgVXBkYXRlVHlwZSB2YWx1ZSkgewogICAgICAgIHVwZGF0ZSgxLCBzdGFydCwgZW5kLCB2YWx1ZSk7CiAgICB9CgogICAgT3V0cHV0VHlwZSB1cGRhdGUoaW50IGluZGV4LCBPdXRwdXRUeXBlIHZhbHVlKSB7CiAgICB1cGRhdGUoMSwgMCwgTi0xLCBpbmRleCwgdmFsdWUpOwogIH0KCiAgT3V0cHV0VHlwZSBnZXRWYWx1ZShpbnQgbG8sIGludCBoaSkgewogICAgU2VnbWVudFRyZWVOb2RlIHJlc3VsdCA9IGdldFZhbHVlKDEsIDAsIE4tMSwgbG8sIGhpKTsKICAgIHJldHVybiByZXN1bHQuZ2V0VmFsdWUoKTsKICB9Cgpwcml2YXRlOgogICAgdm9pZCB1cGRhdGUoaW50IHN0SW5kZXgsIGludCBsbywgaW50IGhpLCBpbnQgaW5kZXgsIE91dHB1dFR5cGUgdmFsdWUpIHsKICAgIGlmIChsbyA9PSBoaSkgewogICAgbm9kZXNbc3RJbmRleF0uYXBwbHlVcGRhdGUodmFsdWUpOwogICAgcmV0dXJuOwogICAgfQoKICAgIGludCBsZWZ0ID0gMiAqIHN0SW5kZXgsIHJpZ2h0ID0gbGVmdCArIDEsIG1pZCA9IChsbyArIGhpKSAvIDI7CiAgICBpZiAoaW5kZXggPD0gbWlkKQogICAgICB1cGRhdGUobGVmdCwgbG8sIG1pZCwgaW5kZXgsIHZhbHVlKTsKICAgIGVsc2UKICAgICAgdXBkYXRlKHJpZ2h0LCBtaWQrMSwgaGksIGluZGV4LCB2YWx1ZSk7CgogICAgbm9kZXNbc3RJbmRleF0ubWVyZ2Uobm9kZXNbbGVmdF0sIG5vZGVzW3JpZ2h0XSk7CiAgfQoKICAgIHZvaWQgYnVpbGRUcmVlKElucHV0VHlwZSBhcnJbXSwgaW50IHN0SW5kZXgsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgIC8vIG5vZGVzW3N0SW5kZXhdIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc2VnbWVudCBbc3RhcnQuLi5lbmRdCiAgICAgICAgbm9kZXNbc3RJbmRleF0uc3RhcnQgPSBzdGFydCwgbm9kZXNbc3RJbmRleF0uZW5kID0gZW5kOwoKICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgICAgIC8vIGEgbGVhZiBub2RlIGlzIHJlc3BvbnNpYmxlIGZvciBhIHNlZ21lbnQgY29udGFpbmluZyBvbmx5IDEgZWxlbWVudAogICAgICAgICAgICBub2Rlc1tzdEluZGV4XS5hc3NpZ25MZWFmKGFycltzdGFydF0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpbnQgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDIsCiAgICAgICAgICAgIGxlZnRDaGlsZEluZGV4ID0gMiAqIHN0SW5kZXgsCiAgICAgICAgICAgIHJpZ2h0Q2hpbGRJbmRleCA9IGxlZnRDaGlsZEluZGV4ICsgMTsKCiAgICAgICAgYnVpbGRUcmVlKGFyciwgbGVmdENoaWxkSW5kZXgsIHN0YXJ0LCBtaWQpOwogICAgICAgIGJ1aWxkVHJlZShhcnIsIHJpZ2h0Q2hpbGRJbmRleCwgbWlkICsgMSwgZW5kKTsKICAgICAgICBub2Rlc1tzdEluZGV4XS5tZXJnZShub2Rlc1tsZWZ0Q2hpbGRJbmRleF0sIG5vZGVzW3JpZ2h0Q2hpbGRJbmRleF0pOwogICAgfQoKICAgIGludCBnZXRTZWdtZW50VHJlZVNpemUoaW50IE4pIHsKICAgICAgICBpbnQgc2l6ZSA9IDE7CiAgICAgICAgZm9yICg7IHNpemUgPCBOOyBzaXplIDw8PSAxKTsKICAgICAgICByZXR1cm4gc2l6ZSA8PCAxOwogICAgfQoKCiAgICBTZWdtZW50VHJlZU5vZGUgcXVlcnkoaW50IHN0SW5kZXgsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgIGlmIChub2Rlc1tzdEluZGV4XS5zdGFydCA9PSBzdGFydCAmJiBub2Rlc1tzdEluZGV4XS5lbmQgPT0gZW5kKQogICAgICAgICAgICByZXR1cm4gbm9kZXNbc3RJbmRleF07CgogICAgICAgIGludCBtaWQgPSAobm9kZXNbc3RJbmRleF0uc3RhcnQgKyBub2Rlc1tzdEluZGV4XS5lbmQpID4+IDEsCiAgICAgICAgICAgIGxlZnRDaGlsZEluZGV4ID0gc3RJbmRleCA8PCAxLAogICAgICAgICAgICByaWdodENoaWxkSW5kZXggPSBsZWZ0Q2hpbGRJbmRleCArIDE7CiAgICAgICAgU2VnbWVudFRyZWVOb2RlIHJlc3VsdDsKCiAgICAgICAgaWYgKHN0YXJ0ID4gbWlkKQogICAgICAgICAgICByZXN1bHQgPSBxdWVyeShyaWdodENoaWxkSW5kZXgsIHN0YXJ0LCBlbmQpOwogICAgICAgIGVsc2UgaWYgKGVuZCA8PSBtaWQpCiAgICAgICAgICAgIHJlc3VsdCA9IHF1ZXJ5KGxlZnRDaGlsZEluZGV4LCBzdGFydCwgZW5kKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgU2VnbWVudFRyZWVOb2RlIGxlZnRSZXN1bHQgPSBxdWVyeShsZWZ0Q2hpbGRJbmRleCwgc3RhcnQsIG1pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFJlc3VsdCA9IHF1ZXJ5KHJpZ2h0Q2hpbGRJbmRleCwgbWlkKzEsIGVuZCk7CiAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IGxlZnRSZXN1bHQuc3RhcnQ7CiAgICAgICAgICAgIHJlc3VsdC5lbmQgPSByaWdodFJlc3VsdC5lbmQ7CiAgICAgICAgICAgIHJlc3VsdC5tZXJnZShsZWZ0UmVzdWx0LCByaWdodFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZvaWQgdXBkYXRlKGludCBzdEluZGV4LCBpbnQgc3RhcnQsIGludCBlbmQsIFVwZGF0ZVR5cGUgdmFsdWUpIHsKICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgICAgIC8vIHdlIGFyZSBvbmx5IGFwcGx5aW5nIHVwZGF0ZXMgb24gbGVhZiBub2RlcwogICAgICAgICAgICBub2Rlc1tzdEluZGV4XS5hcHBseVVwZGF0ZSh2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGludCBtaWQgPSAobm9kZXNbc3RJbmRleF0uc3RhcnQgKyBub2Rlc1tzdEluZGV4XS5lbmQpIC8gMiwKICAgICAgICAgICAgbGVmdENoaWxkSW5kZXggPSAyICogc3RJbmRleCwKICAgICAgICAgICAgcmlnaHRDaGlsZEluZGV4ID0gbGVmdENoaWxkSW5kZXggKyAxOwoKICAgICAgICBpZiAoc3RhcnQgPiBtaWQpCiAgICAgICAgICAgIHVwZGF0ZShyaWdodENoaWxkSW5kZXgsIHN0YXJ0LCBlbmQsIHZhbHVlKTsKICAgICAgICBlbHNlIGlmIChlbmQgPD0gbWlkKQogICAgICAgICAgICB1cGRhdGUobGVmdENoaWxkSW5kZXgsIHN0YXJ0LCBlbmQsIHZhbHVlKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdXBkYXRlKGxlZnRDaGlsZEluZGV4LCBzdGFydCwgbWlkLCB2YWx1ZSk7CiAgICAgICAgICAgIHVwZGF0ZShyaWdodENoaWxkSW5kZXgsIG1pZCsxLCBlbmQsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgbm9kZXNbc3RJbmRleF0ubWVyZ2Uobm9kZXNbbGVmdENoaWxkSW5kZXhdLCBub2Rlc1tyaWdodENoaWxkSW5kZXhdKTsKICAgIH0KfTsKCmludCBBWzEwMDAwNV07CgppbnQgbWFpbigpIHsKICAgIGludCBOLCBRLCBpLCBxdWVyeVR5cGUsIGEsIGIsdix0OwogICAgc2NhbmYoIiVkIiwmdCk7CiAgICB3aGlsZSh0LS0pewogICAgICAgIHNjYW5mKCIlZCAlZCIsICZOLCAmUSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IE47ICsraSkKICAgICAgICAgICAgQVtpXT0wOwogICAgICAgIFNlZ21lbnRUcmVlPGludCxpbnQsaW50PiB0cmVlKEEsIE4pOwoKICAgICAgICB3aGlsZSAoUS0tKSB7CiAgICAgICAgICAgIHNjYW5mKCIlZCVkJWQiLCAmcXVlcnlUeXBlLCAmYSwgJmIpOwogICAgICAgICAgICBpZiAocXVlcnlUeXBlID09IDApewogICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmdik7CiAgICAgICAgICAgICAgIC8vdGhpcyB3b3JrcwogICAgICAgICAgICAgICAgZm9yKGludCBpPWEtMTtpPD1iLTE7aSsrKQogICAgICAgICAgICAgICAgICAgIHRyZWUudXBkYXRlKGksdik7CiAgICAgICAgICAgICAgICAvL3RoaXMgZ2l2ZXMgd3JvbmcgYW5zd2VyCi8vICAgICAgICAgICAgICAgIHRyZWUudXBkYXRlKGEtMSxiLTEsdik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIHByaW50ZigiJWRcbiIsIHRyZWUucXVlcnkoYS0xLCBiLTEpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==