#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e2+10,M=1e5+10;
struct question{int l1,r1,l2,r2,id;}furry[M];
struct furry_kuai{
int by[N],blen;
void init(int n){
blen=sqrt(n);
for(int i=1;i<=n;i++) by[i]=(i-1)/blen+1;
}
inline int id(int x){return by[x];}
}f1,f2;
int a[N][N],sum[M],temp[M],l1,r1,l2,r2,n,m,q,cnt;
ll Furry[M],ans;
inline bool cmp(question x,question y){
if(f1.id(x.l1)^f2.id(y.l1)) return f1.id(x.l1)<f2.id(y.l1);
if(f2.id(x.r1)^f2.id(y.r1)) return f2.id(x.r1)<f2.id(y.r1);
if(f1.id(x.l2)^f1.id(x.l2)) return f1.id(x.l2)<f1.id(x.l2);
return x.r2<y.r2;
}
void update(int x,int y,int z,int val,int opt){
if(opt==1){
if(!x) return;
for(int i=y;i<=z;i++){
int c=a[x][i];
if(!i) continue;
ans-=1ll*sum[c]*sum[c],sum[c]+=val;
ans+=1ll*sum[c]*sum[c];
}
}
else{
if(!z) return;
for(int i=x;i<=y;i++){
int c=a[i][z];
if(!i) continue;
ans-=1ll*sum[c]*sum[c],sum[c]+=val;
ans+=1ll*sum[c]*sum[c];
}
}
}
int main(){
scanf("%d%d",&n,&m);
f1.init(n),f2.init(m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
temp[++cnt]=a[i][j];
}
}
sort(temp+1,temp+cnt+1),cnt=unique(temp+1,temp+cnt+1)-temp-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=lower_bound(temp+1,temp+cnt+1,a[i][j])-temp;
}
}
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
furry[i].l1=min(l1,l2),furry[i].l2=max(l1,l2);
furry[i].r1=min(r1,r2),furry[i].r2=max(r1,r2);
furry[i].id=i;
}
sort(furry+1,furry+q+1,cmp);
l1=1,l2=0,r1=1,r2=0;
for(int i=1;i<=q;i++){
while(l1>furry[i].l1) update(--l1,r1,r2,1,1);
while(r1>furry[i].r1) update(l1,l2,--r1,1,2);
while(l2<furry[i].l2) update(++l2,r1,r2,1,1);
while(r2<furry[i].r2) update(l1,l2,++r2,1,2);
while(l1<furry[i].l1) update(l1++,r1,r2,-1,1);
while(r1<furry[i].r1) update(l1,l2,r1++,-1,2);
while(l2>furry[i].l2) update(l2--,r1,r2,-1,1);
while(r2>furry[i].r2) update(l1,l2,r2--,-1,2);
Furry[furry[i].id]=ans;
}
for(int i=1;i<=q;i++) printf("%lld\n",Furry[i]);
return 0;
}
二维莫队RE,求调