提交时间:2026-04-24 16:59:13

运行 ID: 41469

#include<bits/stdc++.h> #define fi first #define se second #define mk make_pair using namespace std; using ll=long long; using pii=pair<int,int>; const int N=1e5+10,M=12; int m,n,q; int a[N][M],b[N][M]; ll dis[N][M][M]; ll L[N][M][M],R[N][M][M]; void floyd(ll arr[M][M]){ for(int i=1;i<=m;i++){ for(int j=1;j<=m;j++){ for(int k=1;k<=m;k++){ arr[j][k]=min(arr[j][k],arr[j][i]+arr[i][k]); } } } } #define ls p*2 #define rs p*2+1 #define mid (l+r)/2 ll info[N<<2][M][M]; void build(int p,int l,int r){ if(l==r) return memcpy(info[p],dis[l],sizeof(dis[l])),void(); build(ls,l,mid);build(rs,mid+1,r); auto pu=[&](){ for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)for(int k=1;k<=m;k++) info[p][j][k]=min(info[p][j][k],info[ls][j][i]+a[mid][i]+info[rs][i][k]); };pu(); } ll ans[M],tmp[M]; void query(int p,int l,int r,int pl,int pr){ auto upd=[&](){ bool ok=(l!=pl); memset(tmp,0x3f,sizeof(tmp)); for(int i=1;i<=m;i++){ for(int j=1;j<=m;j++){ tmp[j]=min(tmp[j],ans[i]+info[p][i][j]+ok*a[l-1][i]); } }memcpy(ans,tmp,sizeof(ans)); }; if(pl<=l&&r<=pr) return upd(),void(); if(pl<=mid) query(ls,l,mid,pl,pr); if(pr>mid) query(rs,mid+1,r,pl,pr); } int main(){ //freopen("optimization.in","r",stdin); //freopen("optimization.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>m>>n>>q; for(int i=1;i<=m;i++) for(int j=1;j<n;j++) cin>>a[j][i];//D for(int i=1;i<m;i++) for(int j=1;j<=n;j++) cin>>b[j][i];//R memset(L,0x3f,sizeof(L)); memset(R,0x3f,sizeof(R)); memset(info,0x3f,sizeof(info)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) L[i][j][j]=0; for(int j=1;j<m;j++) L[i][j][j+1]=b[i][j],L[i][j+1][j]=b[i][j]; if(i>1){ for(int x=1;x<=m;x++)for(int y=1;y<=m;y++) L[i][x][y]=min(L[i][x][y],a[i-1][x]+a[i-1][y]+L[i-1][x][y]); }floyd(L[i]); } for(int i=n;i>=1;i--){ for(int j=1;j<=m;j++) R[i][j][j]=0; for(int j=1;j<m;j++) R[i][j][j+1]=b[i][j],R[i][j+1][j]=b[i][j]; if(i<n){ for(int x=1;x<=m;x++)for(int y=1;y<=m;y++) R[i][x][y]=min(R[i][x][y],a[i][x]+a[i][y]+R[i+1][x][y]); }floyd(R[i]); } for(int i=1;i<=n;i++){ for(int x=1;x<=m;x++)for(int y=1;y<=m;y++) dis[i][x][y]=min(L[i][x][y],R[i][x][y]); floyd(dis[i]); }build(1,1,n); for(int i=1;i<=q;i++){ int a,b,c,d;cin>>a>>b>>c>>d; if(b>d) swap(b,d),swap(a,c); memset(ans,0x3f,sizeof(ans));ans[a]=0; query(1,1,n,b,d);cout<<ans[c]<<'\n'; } return 0; }