#include using namespace std; using ll=long long; void ch_ans(const vector>& V1,const vector>& V2,int v1d,int v2d,map,2>,int>& ng,int& ans){ for(int i=0;id1={v1d,i,dx1,dy1}; for(int j=0;jd2={v2d,j,dx2,dy2}; if(d1==d2)continue; int now=V1[i][(dx1+1)*3+(dy1+1)]+V2[j][(dx2+1)*3+(dy2+1)]; if(ng.contains({d1,d2})){ now-=ng[{d1,d2}]; } if(now>ans){ ans=now; } ans=max(ans,now); } } } } } } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int H,W; cin>>H>>W; vector A(H,vector(W,0)); for(int i=0;i>A[i][j]; } vector> H0(W+2),H1(W+2),W0(H+2),W1(H+2); for(int i=0;i=0&&x=0&&y,2>,int>ng; for(int i=0;i>d; for(int dx=-1;dx<=1;dx++){ for(int dy=-1;dy<=1;dy++){ if(dy==0&&dx==0)continue; int x=i,y=j; while(bound_ok(x,y)){ x-=dx,y-=dy; } if(x==-1){ d.push_back({0,y+1,dx,dy}); } if(x==H){ d.push_back({1,y+1,dx,dy}); } if(y==-1){ d.push_back({2,x+1,dx,dy}); } if(y==W){ d.push_back({3,x+1,dx,dy}); } } } for(auto d1:d){ for(auto d2:d){ ng[{d1,d2}]=A[i][j]; if(d1[2]==d2[2]&&d1[3]==d2[3]||d1[2]==-d2[2]&&d1[3]==-d2[3]){ switch(d1[0]){ case 0:ng[{d1,d2}]=H0[d1[1]][(d1[2]+1)*3+(d1[3]+1)];break; case 1:ng[{d1,d2}]=H1[d1[1]][(d1[2]+1)*3+(d1[3]+1)];break; case 2:ng[{d1,d2}]=W0[d1[1]][(d1[2]+1)*3+(d1[3]+1)];break; case 3:ng[{d1,d2}]=W1[d1[1]][(d1[2]+1)*3+(d1[3]+1)];break; } } } } } } int ans=0; for(auto i:H0){ for(auto j:i)ans=max(ans,j); } for(auto i:H1){ for(auto j:i)ans=max(ans,j); } for(auto i:W0){ for(auto j:i)ans=max(ans,j); } for(auto i:W1){ for(auto j:i)ans=max(ans,j); } ch_ans(H0,H0,0,0,ng,ans); ch_ans(H0,H1,0,1,ng,ans); ch_ans(H0,W0,0,2,ng,ans); ch_ans(H0,W1,0,3,ng,ans); ch_ans(H1,H0,1,0,ng,ans); ch_ans(H1,H1,1,1,ng,ans); ch_ans(H1,W0,1,2,ng,ans); ch_ans(H1,W1,1,3,ng,ans); ch_ans(W0,H0,2,0,ng,ans); ch_ans(W0,H1,2,1,ng,ans); ch_ans(W0,W0,2,2,ng,ans); ch_ans(W0,W1,2,3,ng,ans); ch_ans(W1,H0,3,0,ng,ans); ch_ans(W1,H1,3,1,ng,ans); ch_ans(W1,W0,3,2,ng,ans); ch_ans(W1,W1,3,3,ng,ans); cout<