二维树状数组,一直卡在这题
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x&-x)
using namespace std;
int n,m,c[(1<<13)][(1<<13)],tot;
void add(int x,int y,int k){
for(int i=x;i<=n;i+=lowbit(i)){
for(int j=y;j<=n;j+=lowbit(j)){
c[i][j]+=k;
}
}
}
int ask(int x,int y){
int ans=0;
for(int i=x;i;i-=lowbit(i)){
for(int j=y;j;j-=lowbit(j)){
ans+=c[i][j];
}
}
return ans;
}
int query(int x,int y,int x2,int y2){
x++,y++,x2++,y2++;
return ask(x2,y2)-ask(x-1,y2)-ask(x2,y-1)+ask(x-1,y-1);
}
int op,x,y,x2,y2,k,q;
char ch;
signed main(){
cin>>n>>q;
m=n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>ch;
if(ch=='B') add(i,j,1),tot++;
}
}
for(int i=1;i<=q;i++){
int ans=0;
scanf("%lld%lld%lld%lld",&x,&y,&x2,&y2);
int lux=x/n,luy=y/n,rdx=x2/n,rdy=y2/n;
int fx=x%n,fy=y%n,fx2=x2%n,fy2=y2%n;
// cout<<lux<<" "<<luy<<" "<<rdx<<" "<<rdy<<" "<<fx<<" "<<fy<<" "<<fx2<<" "<<fy2<<endl;
if(lux==rdx&&luy==rdy) ans=query(fx,fy,fx2,fy2);
else if(lux==rdx){
ans+=query(fx,fy,fx2,n-1)+query(fx,0,fx2,fy2);
ans+=query(fx,0,fx2,n-1)*(rdy-luy-1);
}else if(luy==rdy){
ans+=query(fx,fy,n-1,fy2)+query(0,fy,fx2,fy2);
ans+=query(0,fy,n-1,fy2)*(rdx-lux-1);
}else{
ans+=query(fx,fy,n-1,n-1)+query(fx,0,n-1,fy2)+query(0,fy,fx2,n-1)+query(0,0,fx2,fy2);
ans+=query(fx,0,n-1,n-1)*(rdx-lux-1);
ans+=query(0,fy,n-1,n-1)*(rdy-luy-1);
ans+=query(0,0,n-1,fy2)*(rdy-luy-1);
ans+=query(0,0,fx2,n-1)*(rdx-lux-1);
ans+=tot*(rdy-luy-1)*(rdx-lux-1);
}
cout<<ans<<endl;
}
}