#include using namespace std; typedef long long ll; struct P{ int x,y; ll k,ans; }; int main(){ int h,w; scanf("%d%d",&h,&w); int gx,gy; scanf("%d%d",&gx,&gy); gx--; gy--; vector> a(h,vector(w)); for(int i=0;i>q; vector

query(q); for(auto &e:query){ scanf("%d%d%lld",&e.x,&e.y,&e.k); e.x--; e.y--; } const int K=300; vector> small(K); for(int i=0;i> dist(h,vector(w)); for(int k=1;k>,vector>>,greater>>> pq; dist[gx][gy]=0; pq.push({0,{gx,gy}}); ll add=1LL*k*k; while(!pq.empty()){ auto [d,pos]=pq.top(); pq.pop(); int x=pos.first; int y=pos.second; if(d!=dist[x][y]){ continue; } ll nd=d+a[x][y]+add; for(int i=0;i<4;i++){ int nx=x+dx[i]; int ny=y+dy[i]; if(nx>=0&&nx=0&&nynd){ dist[nx][ny]=nd; pq.push({nd,{nx,ny}}); } } } } for(int id:small[k]){ int x=query[id].x; int y=query[id].y; query[id].ans=dist[x][y]+a[x][y]+add; } } vector>> d(h,vector>(w,{INT_MAX,LLONG_MAX})); priority_queue,pair>,vector,pair>>,greater,pair>>> pq; d[gx][gy]={0,0}; pq.push({{0,0},{gx,gy}}); while(!pq.empty()){ auto cur=pq.top(); pq.pop(); int x=cur.second.first; int y=cur.second.second; auto now=cur.first; if(d[x][y] nxt={now.first+1,now.second+a[x][y]}; for(int i=0;i<4;i++){ int nx=x+dx[i]; int ny=y+dy[i]; if(nx>=0&&nx=0&&nynxt){ d[nx][ny]=nxt; pq.push({nxt,{nx,ny}}); } } } } for(auto &e:query){ if(e.k>=K){ int len=d[e.x][e.y].first+1; ll val=d[e.x][e.y].second+a[e.x][e.y]; e.ans=val+e.k*e.k*len; } } for(auto e:query){ printf("%lld\n",e.ans); } return 0; }