#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int maxn=1007;
int i,j,k,l,n,m,ans,x,y,ans1,ans2;
int a[maxn][maxn],f[maxn][maxn],g[maxn][maxn];
int t[500007*4],b[1000007];
void build(int x,int l,int r){
if(l==r){
t[x]=b[l];
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
t[x]=max(t[x*2],t[x*2+1]);
}
int find(int x,int l,int r,int y,int z){
if(y>z)return 0;
if(l==y&&r==z){
return t[x];
}
int mid=(l+r)/2;
if(z<=mid)return find(x*2,l,mid,y,z);
else if(y>mid)return find(x*2+1,mid+1,r,y,z);
else{
return max(find(x*2,l,mid,y,mid),find(x*2+1,mid+1,r,mid+1,z));
}
}
int read(){
int x=0;
char ch=getchar();
while(ch>'9'||ch<'0')ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();
return x;
}
int main(){
// freopen("fan.in","r",stdin);
// freopen("fan.out","w",stdout);
n=read(),m=read();
fo(i,1,n){
fo(j,1,i){
a[i][j]=read();
}
}
fo(i,1,n){
fo(j,1,i){
f[i][j]=max(f[i][j],f[i-1][j-1]+a[i][j]);
f[i][j]=max(f[i][j],f[i-1][j]+a[i][j]);
}
}
fo(i,1,n)g[n][i]=a[n][i],ans1=max(ans1,f[n][i]);
fod(i,n-1,1){
fo(j,1,i){
g[i][j]=max(g[i][j],g[i+1][j+1]+a[i][j]);
g[i][j]=max(g[i][j],g[i+1][j]+a[i][j]);
}
}
fo(i,1,n)fo(j,1,i)b[++b[0]]=f[i][j]+g[i][j]-a[i][j];
build(1,1,b[0]);
while(m--){
x=read(),y=read();
if(x==1&&y==1)printf("-1\n");
else{
ans=0;
int u=(1+(x-1))*(x-1)/2+1,v=(1+x)*x/2,now=u-1+y;
ans=max(ans,find(1,1,b[0],u,now-1));
ans=max(ans,find(1,1,b[0],now+1,v));
printf("%d\n",ans);
}
}
}