//这是用来断点调试的
#include<iostream>
#include<unordered_map>
using namespace std;
const int maxn=9;
inline int lowbit(int x){
return x&-x;
}
struct Int{
int val[maxn+1];
void upd(int id,int v){
val[id]+=v;
}
int summ(int id){
return val[id];
}
};
template<typename T>
struct Tree{
T cc=T();
void upd(int id,int v){
while(id<=maxn){
// cout << "id=" << id << ",now cc[id].value=" << cc.summ(id) << ".\n";
cc.upd(id,v);
// cout << "now cc[id].value=" <<cc.summ(id) << ".\n";
id+=lowbit(id);
}
}
int summ(int id){
int sum=0;
while(id){
sum+=cc.summ(id);
id-=lowbit(id);
}
return sum;
}
};
Tree<Tree<Int>> c;
Tree<Int> a;
int main(){
int m,p;
cin >> m >> p;
for(int i=1;i<=m;i++){
int id,x,y,l;
cin >> id >> x >> y >> l;
if(i+l<=m){
x-=y;
}
a.upd(id,x);
c.upd(id,x);
}
for(int i=1;i<=p;i++){
int x,y;
cin >> x >> y;
cout << c.summ(y)-c.summ(x-1) << endl;
}
// for(int i=1;i<=3;i++){
// cout << c.cc.cc.summ(i) << ' ';
// }
// cout << '\n';
// for(int i=1;i<=3;i++){
// cout << c.cc.summ(i) << ' ';
// }
// cout << '\n';
// for(int i=1;i<=3;i++){
// cout << c.summ(i) << ' ';
// }
// cout << '\n';
// for(int i=1;i<=3;i++){
// cout << a.summ(i) << ' ';
// }
// cout << '\n';
return 0;
}
(我把maxn改小了,方便调试)对于数据
9 3
1 2 0 0
2 1 0 0
3 2 0 0
1 5 4 2
3 1 0 5
1 9 100 10
2 0 2 1
2 1 0 1
2 2 3 2
1 2
2 3
1 3
出错的原因:程序中a.cc对象和c.cc.cc理应是一样的(都是原始数组),但实际数据却是不一样的(a.cc对象是正确的,c.cc.cc对象在id=3时返回了错误的结果),详情可以见后面注释掉的输出。但是我不知道为什么这里会出错,以及怎么改错。
注:树状数组套树状数组应该是计算前缀和的前缀和用的。