比较裸的二维树状数组,有一个思维点在于需要取模。每次查询的值不一样,但是因为c最多只有10,所以记录下0-10分别是哪个值即可。
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
const int MAXN=110;
int a[11][MAXN][MAXN];
int lowbit(int i){
return i&-i;
}
int c;
int nn=100;
int t;
int tt;
void add(int x,int y,int num){
for(int i=x;i<=nn;i+=lowbit(i)){
for(int j=y;j<=nn;j+=lowbit(j)){
a[tt][i][j]+=(num+tt)%(c+1);
}
}
}
int sum(int i, int j){
int result = 0;
for(int x = i; x > 0; x -= lowbit(x)) {
for(int y = j; y > 0; y -= lowbit(y)) {
result += a[tt][x][y];
}
}
//printf("%d %d %d\n",i,j,result);
return result;
}
int main(){
int n,q;
scanf("%d%d%d",&n,&q,&c);
for(int i=0;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
for(tt=0;tt<=c;tt++){
add(x,y,z);
}
}
for(int i=0;i<q;i++){
int x1,y1,x2,y2;
scanf("%d%d%d%d%d",&t,&x1,&y1,&x2,&y2);
tt=t%(c+1);
printf("%d\n",sum(x2,y2)+sum(x1-1,y1-1)-sum(x1-1,y2)-sum(x2,y1-1));
}
}