https://nanti.jisuanke.com/t/41298
#include <bits/stdc++.h>
#define MAXN 1000006
#define MAXQ 100005
#define MAXM 100005
#define ask 0
#define add 1
using namespace std;
int T,n,m,q;
struct point {
int x,y,val;
bool kind;
int id = 0;
int f;
point(int _x,int _y,int _val,bool _kind,int _id,int _f):x(_x),y(_y),val(_val),kind(_kind),id(_id),f(_f){}
point()=default;
bool operator < (const point a)const
{
if(x!=a.x)
return x<a.x;
else
return kind>a.kind;
}
} poi[MAXM+MAXQ*4+100];
int change(long long x)
{
int ret = 0;
while(x) {
ret+=x%10;
x/=10;
}
return ret;
}
int getval(int x,int y)
{
if(n == 1){
return 1;
}
int level = min(x,y);
int b = max(x,y);
b = n+1 - b;
level = min(level,b);
int len = n - 2*(level - 1);
long long start = 1;
if(level!=1) {
start = 1LL +4LL*(long long)n*(long long)level - 4LL*(long long)n + 8LL*(long long)level - 4LL - 4LL*(long long)level*(long long)level;
}
long long ans = start;
int startx = n+1-level,starty = n+1-level;
if(x==startx) {
ans += starty - y;
return change(ans);
} else {
ans+=len-1;
starty-=len-1;
if(y == starty) {
ans+=startx - x;
return change(ans);
} else {
ans+=len-1;
startx -= len-1;
if(x == startx) {
ans+=y - starty;
return change(ans);
} else {
starty+=len-1;
ans+=len-1;
return change(ans+x-startx);
}
}
}
}
vector<int> lsh;
map<int,int>ll;
long long tree[MAXN+1];
long long asks(int x){
long long ans = 0;
for(;x;x -= x&-x)
ans += tree[x];
return ans;
}
void adds(int x,long long y){
for(; x<=MAXN;x+=x&-x)
tree[x] += y;
}
long long ans[MAXQ];
int main()
{
scanf("%d",&T);
while(T--) {
lsh.clear();
ll.clear();
scanf("%d%d%d",&n,&m,&q);
memset(tree,0,sizeof(tree));
for(int i = 1;i<=q;i++){
ans[i] = 0;
}
for(int i = 1; i<=m; i++) {
int a,b;
scanf("%d%d",&a,&b);
poi[i] = point(a,b,getval(a,b),add,0,0);
}
for(int i = 1; i<=q; i++) {
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int k = 4*i;
poi[m+k] = point(x1-1,y1-1,0,ask,i,1);
poi[m+k-1] = point(x2,y2,0,ask,i,1);
poi[m+k-2] = point(x1-1,y2,0,ask,i,-1);
poi[m+k-3] = point(x2,y1-1,0,ask,i,-1);
}
for(int i = 1; i<=m+q*4; i++) {
lsh.push_back(poi[i].x);
lsh.push_back(poi[i].y);
}
sort(lsh.begin(),lsh.end());
int tot = unique(lsh.begin(),lsh.end()) - lsh.begin();
for(int i = 0; i<tot; i++) {
ll[lsh[i]] = i+1;
}
for(int i = 1; i<=m+q*4; i++) {
poi[i].x = ll[poi[i].x];
poi[i].y = ll[poi[i].y];
}
sort(poi+1,poi+m+q*4+1);
for(int i = 1;i<=m+q*4;i++){
if(poi[i].kind == add){
adds(poi[i].y,poi[i].val);
}else{
int flag = poi[i].f;
int id = poi[i].id;
int yy = poi[i].y;
ans[id]+=(long long)flag*asks(yy);
}
}
for(int i = 1;i<=q;i++){
printf("%lld\n",ans[i]);
}
}
}