感觉能用的卡常方法都用完了啊,大悲
#include<bits/stdc++.h>
using namespace std;
const int N=250001,M=501,Q=60001;
int n,m,b[N],ans[Q],p[M][M],cl,c[M],s[N],sum[M],ccl,cc[N],l,r,u,d;
struct node{
int u,l,d,r,k,id;
}q[Q];
inline int read(){
register int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void build(){
cl=n/pow(m,0.25)/3+1;
ccl=n+1;
for(register int i=1;i<=n;++i) c[i]=(i-1)/cl+1;
for(register int i=1;i<=n*n;++i) cc[i]=(i-1)/ccl+1;
}
inline bool cmp(node x,node y){
if(c[x.u]!=c[y.u]) return x.u<y.u;
if(c[x.l]!=c[y.l]) return c[x.u]&1? x.l<y.l:x.l>y.l;
if(c[x.r]!=c[y.r]) return c[x.l]&1? x.r<y.r:x.r>y.r;
return c[x.r]&1? x.d<y.d:x.d>y.d;
}
inline int query(int x){
register int i=1,cnt=0;
for(;cnt+sum[i]<x&&i<=cc[n*n];++i) cnt+=sum[i];
i=(i-1)*ccl+1;
for(;cnt+s[i]<x&&i<=n*n;++i) cnt+=s[i];
return b[i];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
n=read();
m=read();
for(register int i=1;i<=n;++i){
for(register int j=1;j<=n;++j){
p[i][j]=read();
b[++l]=p[i][j];
}
}
sort(b+1,b+1+l);
l=unique(b+1,b+1+l)-b-1;
for(register int i=1;i<=n;++i) for(register int j=1;j<=n;++j) p[i][j]=lower_bound(b+1,b+1+l,p[i][j])-b;
for(register int i=1;i<=m;++i){
q[i].u=read();
q[i].l=read();
q[i].d=read();
q[i].r=read();
q[i].k=read();
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
s[p[1][1]]++;
sum[cc[p[1][1]]]++;
l=1,r=1,u=1,d=1;
for(register int i=1;i<=m;++i){
for(;r<q[i].r;++r) for(register int i=u;i<=d;++i) ++s[p[i][r+1]],++sum[cc[p[i][r+1]]];
for(;l>q[i].l;--l) for(register int i=u;i<=d;++i) ++s[p[i][l-1]],++sum[cc[p[i][l-1]]];
for(;d<q[i].d;++d) for(register int i=l;i<=r;++i) ++s[p[d+1][i]],++sum[cc[p[d+1][i]]];
for(;u>q[i].u;--u) for(register int i=l;i<=r;++i) ++s[p[u-1][i]],++sum[cc[p[u-1][i]]];
for(;r>q[i].r;--r) for(register int i=u;i<=d;++i) --s[p[i][r]],--sum[cc[p[i][r]]];
for(;l<q[i].l;++l) for(register int i=u;i<=d;++i) --s[p[i][l]],--sum[cc[p[i][l]]];
for(;d>q[i].d;--d) for(register int i=l;i<=r;++i) --s[p[d][i]],--sum[cc[p[d][i]]];
for(;u<q[i].u;++u) for(register int i=l;i<=r;++i) --s[p[u][i]],--sum[cc[p[u][i]]];
ans[q[i].id]=query(q[i].k);
}
for(register int i=1;i<=m;++i) cout<<ans[i]<<'\n';
}