感觉读错题了,暴力过不去啊,样例都过了
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const ll N=505;
int n,m,q,h[N][N],e[N][N],id[N],fa[N],a[N],b[N],c[N],d[N],ans[N];
int yyz(int x,int y){return (x-1)*m+y;}
int X(int x){return x/m+1;}
int Y(int x){return (x-1)%m+1;}
bool cmp(int x,int y){return h[X(x)][Y(x)]>h[X(y)][Y(y)];}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){fa[find(x)]=find(y);};
vector<int>v[N],g[N];
signed main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%d",&h[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%d",&e[i][j]);
for(int x1=1;x1<=n;x1++)
for(int y1=1;y1<=m;y1++)
for(int x2=1;x2<=n;x2++)
for(int y2=1;y2<=m;y2++)
if(h[x1][y1]-h[x2][y2]+e[x1][y1]>=abs(x1-x2)+abs(y1-y2)){
v[yyz(x1,y1)].push_back(yyz(x2,y2));
}
for(int i=1;i<=n*m;i++) id[i]=fa[i]=i;
sort(id+1,id+n*m+1,cmp);
for(int i=1;i<=q;i++){
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
ans[i]=-1;
}
for(int i=1;i<=n*m;i++){
for(int to:v[id[i]]) merge(id[i],to);
for(int j=1;j<=q;j++)
if(find(yyz(a[j],b[j]))==find(yyz(c[j],d[j])))
ans[j]=max(ans[j],h[X(id[i])][Y(id[i])]);
}
for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
return 0;
}