在一个星光摧残的夜晚,蒜头君一颗一颗的数这天上的星星。
蒜头君给在天上巧妙的画了一个直角坐标系,让所有的星星都分布在第一象。天上有 n颗星星,他能知道每一颗星星的坐标和亮度。
现在,蒜头君问自己 q次,每次他问自己每个矩形区域的星星的亮度和是多少(包含边界上的星星)。
输入格式
第一行输入一个整数 n(1≤n≤50000) 表示星星的数量。
接下里 nnn 行,每行输入三个整数 x,y,w(0≤x,y,w≤2000),表示在坐标 (x,y) 有一颗亮度为 www 的星星。注意一个点可能有多个星星。
接下来一行输入一个整数 q(1≤q≤50000),表示查询的次数。
接下来 qqq 行,每行输入四个整数 x1,y1,x2,y2,其中 (x1,y1) 表示查询的矩形的左下角的坐标,(x2,y2) 表示查询的矩形的右上角的坐标,0≤x1≤x2≤2000 ,0≤y1≤y2≤2000
输出格式
对于每一次查询,输出一行一个整数,表示查询的矩形区域内的星星的亮度总和。
样例输入
5
5 0 6
7 9 7
8 6 13
9 7 1
3 0 19
4
0 8 7 9
0 0 7 10
2 7 10 9
5 4 7 5
样例输出
7
32
8
0
/*
如果坐标都从0开始算 但是公式是从i= j = 1开始 sum[i][j] = sum[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]; 那么比如(3,0)=4,那么(4.0)应该也得4,才可以保证之后算的(4,1)是正确的。但是由于坐标中有0 的情况没有计算,导致内部的点也计算错误
*/
#include<iostream>
#include<cstring>
using namespace std;
int n;
long long int sum[2005][2005];
int x,y;
long long int w;
int q;
int x1,y1,x2,y2;
long long int ans;
int main()
{
memset(sum,0,sizeof(sum));
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>x>>y>>w;
sum[x+1][y+1] += w;//同一个点可能有多个星星,所以是累加 如果不是x+1 y+1 那么
}
//将sum[x][y]记录为以原点为左下角,以(x,y)为右上角的矩形的亮度之和
//当坐标都往上往右移动之后,虽然1和j从1开始,但是实际坐标中包含0 的那些坐标也包含在内,参与计算
for(int i = 1;i<=2001;i++)
{
for(int j = 1;j<=2001;j++)
{
sum[i][j] = sum[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
}
}
//cout<<sum[6][1]<<endl;
// cout<<sum[8][10]<<endl;
// cout<<sum[9][7]<<endl;
cout<<sum[10][8]<<endl;
// cout<<sum[4][1]<<endl;
cin>>q;
for(int i = 0;i<q;i++)
{
cin>>x1>>y1>>x2>>y2;
x1++;
y1++;
x2++;
y2++;
//if(x1>0&&y1>0)
ans = sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1];
//要是都已经往上往右移动了 就不用以下再分情况了
//else if(x1 == 0&&y1 == 0) ans = sum[x2][y2];
//else if (x1 == 0)
//ans = sum[x2][y2] - sum[x2][y1-1];
//else if(y1 == 0)
// ans = sum[x2][y2] - sum[x1-1][y2];
cout<<ans<<endl;
}
return 0;
}