const int MAXN=505,MAXQ=6e4+5;
struct Num{
int x,y,v;
bool operator < (const Num &b){
return v<b.v;
}
}a[MAXN*MAXN];
struct Query{
int x1,y1,x2,y2,k,id;
}q[MAXQ],q1[MAXQ],q2[MAXQ];
int n,c[MAXN][MAXN],ans[MAXQ];
#define lowbit(x) ((x)&(-x))
void add(int x,int y,int v){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
c[i][j]+=v;
}
int get_s(int x,int y){
int ans=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
ans+=c[i][j];
return ans;
}
int query(int x1,int y1,int x2,int y2){
return get_s(x2,y2)-get_s(x1-1,y2)-get_s(x2,y1-1)+get_s(x1-1,y1-1);
}
void solver(int ql,int qr,int vl,int vr){
if(ql>qr)return;
int vm=vl+vr>>1;
if(vl==vr){
_rep(i,ql,qr)ans[q[i].id]=a[vm].v;
return;
}
_rep(i,vl,vm)add(a[i].x,a[i].y,1);
int cnt1=0,cnt2=0,pos=ql;
_rep(i,ql,qr){
int r=query(q[i].x1,q[i].y1,q[i].x2,q[i].y2);
if(q[i].k<=r)q1[++cnt1]=q[i];
else{
q2[++cnt2]=q[i];
q2[cnt2].k-=r;
}
}
_rep(i,vl,vm)add(a[i].x,a[i].y,-1);
_rep(i,1,cnt1)q[pos++]=q1[i];
_rep(i,1,cnt2)q[pos++]=q2[i];
solver(ql,qr-cnt2,vl,vm);solver(ql+cnt1,qr,vm+1,vr);
}
int main()
{
n=read_int();
int m=read_int(),cnt=0,x1,y1,x2,y2;
_rep(i,1,n)_rep(j,1,n)
a[++cnt]=Num{i,j,read_int()};
sort(a+1,a+cnt+1);
_rep(i,1,m){
x1=read_int(),y1=read_int(),x2=read_int(),y2=read_int();
q[i]=Query{x1,y1,x2,y2,read_int(),i};
}
solver(1,m,1,cnt);
_rep(i,1,m)
enter(ans[i]);
return 0;
}