请看此段b=2部分的代码
namespace b2 {
const int M=75010;
int n,d,m;
struct node {
int u,v;
} p[N];
int x[N],y[N];
int tr[3*M];
int lowbit(int x) {
return x&-x;
}
void update(int x,int d) {
if(x<=0) return;
while(x<=3*m ){//
tr[x]+=d;
x+=lowbit(x);
}
}
int query(int x) {
int res=0;
if(x>3*m)return tr[3*m];//
while(x>0) {
res+=tr[x];
x-=lowbit(x);
}
return res;
}
void solve() {
cin>>n>>d>>m;
for(int i=1; i<=n; i++) {
cin>>x[i]>>y[i];
p[i].u=x[i]+y[i]+m;
p[i].v=x[i]-y[i]+m;
}
sort(p+1,p+n+1,[](const node &a,const node &b) {
return a.u<b.u;
});
int j=1;
long long ans=0;
for(int i=1; i<=n; i++) {
while(j<i && p[i].u-p[j].u>d) {
update(p[j].v,-1);
j++;
}
ans+=query(p[i].v+d)-query(p[i].v-d-1);
update(p[i].v,1);
}
cout<<ans<<"\n";
}
}
下面是把斜杠处的 m 改为 M 后的
#include<bits/stdc++.h>
using namespace std;
int b;
const int N=1e5+10;
namespace b1 {
int x[N];
int n,d,m;
void solve() {
cin>>n>>d>>m;
for(int i=1; i<=n; i++)cin>>x[i];
sort(x+1,x+n+1);
int l=1,r=1;
long long ans=0;
for(; l<=n; l++) {
while(x[r+1]-x[l]<=d && r+1<=n)r++;
ans+=(r-l);
// cout<<r<<" "<<l<<"\n";
}
cout<<ans;
}
}
namespace b2 {
const int M=75010;
int n,d,m;
struct node {
int u,v;
} p[N];
int x[N],y[N];
int tr[3*M];
int lowbit(int x) {
return x&-x;
}
void update(int x,int d) {
if(x<=0) return;
while(x<=3*M ){//
tr[x]+=d;
x+=lowbit(x);
}
}
int query(int x) {
int res=0;
if(x>3*M)return tr[3*M];//
while(x>0) {
res+=tr[x];
x-=lowbit(x);
}
return res;
}
void solve() {
cin>>n>>d>>m;
for(int i=1; i<=n; i++) {
cin>>x[i]>>y[i];
p[i].u=x[i]+y[i]+m;
p[i].v=x[i]-y[i]+m;
}
sort(p+1,p+n+1,[](const node &a,const node &b) {
return a.u<b.u;
});
int j=1;
long long ans=0;
for(int i=1; i<=n; i++) {
while(j<i && p[i].u-p[j].u>d) {
update(p[j].v,-1);
j++;
}
ans+=query(p[i].v+d)-query(p[i].v-d-1);
update(p[i].v,1);
}
cout<<ans<<"\n";
}
}
namespace b3{
struct node {
int u,v,z;
} p[N];
int n,d,m;
// int sum
void solve(){
cin>>n>>d>>m;
for(int i=1;i<=n;i++){
int x,y,z;
cin>>x>>y>>z;
p[i].u=x+y,p[i].v=x-y,p[i].z=z;
// sum[p[i].u][p[i].v][z]++;
}
}
}
int main() {
cin>>b;
if(b==1) b1::solve();
if(b==2) b2::solve();
// if(b==3) b3::solve();
return 0;
}
请问是什么原理?