#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#define ll long long
using namespace std;
const int f1[2][2]={{1,0},{1,1}};
const int g[2][2]={{-1,0},{-1,-1}};
const int maxn=1005;
int a[maxn][maxn],d[maxn*maxn],f[maxn*maxn],fa[maxn*maxn],v[maxn*maxn*4];
intx,y,n,m,i,t,j,k,l,p,ans,b[maxn*10],d1[maxn*maxn],ans1[maxn];
bool bz[maxn*maxn],bz1[maxn*maxn];
int main(){
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=i;j++)
scanf("%d",&a[i][j]);
v[1]=1;i=0;j=1;d[1]=a[1][1];bz[1]=true;
while (i<j){
i++;
if (v[i]/n+1>=n) break;
for (k=0;k<=1;k++){
x=v[i]/n+1+f1[k][0],y=v[i]%n+f1[k][1];
if (d[(x-1)*n+y]<d[v[i]]+a[x][y]){
d[(x-1)*n+y]=d[v[i]]+a[x][y];
fa[(x-1)*n+y]=v[i];
if (!bz[(x-1)*n+y]){
v[++j]=(x-1)*n+y;
bz[(x-1)*n+y]=true;
}
}
}
bz[v[i]]=false;
}
memset(bz,0,sizeof(bz));
for (i=1;i<=n;i++)
if (d[(n-1)*n+i]>k){
k=d[(n-1)*n+i];
p=(n-1)*n+i;
}ans=k;
while (p) b[++b[0]]=p,bz1[p]=true,p=fa[p];
for (i=1;i<=n;i++)
v[i]=(n-1)*n+i,d1[(n-1)*n+i]=a[n][i],bz[(n-1)*n+i]=true;
i=0;j=n;
while (i<j){
i++;
if (v[i]==1) break;
for (k=0;k<=1;k++){
x=v[i]/n+1+g[k][0],y=v[i]%n+g[k][1];
if (!(v[i]%n)) x--,y+=n;
if (!y) continue;
if (d1[(x-1)*n+y]<d1[v[i]]+a[x][y]){
d1[(x-1)*n+y]=d1[v[i]]+a[x][y];
if (!bz[(x-1)*n+y]){
v[++j]=(x-1)*n+y;
bz[(x-1)*n+y]=true;
}
}
}
bz[v[i]]=false;
}
for (i=n;i>=2;i--){
k=0;
for (j=1;j<=i;j++){
if ((i-1)*n+j==b[n-i+1]) continue;
k=max(k,d[(i-1)*n+j]+d1[(i-1)*n+j]-a[i][j]);
}
ans1[n-i+1]=k;
}
for (i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if (x==1) printf("-1\n");
elseif (bz1[(x-1)*n+y]) printf("%d\n",ans1[n-x+1]);
elseprintf("%d\n",ans);
}
}