知道 n,m 可能会超一千,但是不会开(
map 会 T,vector 貌似不行(?)
#include<bits/stdc++.h>
using namespace std;
const int N=1010,L=15;
int T,n,m,l,r,mid,lg[N],dp[N][N][L];
int query(int x,int y,int c){
int k=lg[c];
return min(min(dp[x][y][k],dp[x+c-(1<<k)][y][k]),min(dp[x][y+c-(1<<k)][k],dp[x+c-(1<<k)][y+c-(1<<k)][k]));
}bool check(int c){
for(int i=1;i<=n-c+1;i++)for(int j=1;j<=m-c+1;j++)if(query(i,j,c)>=c)return 1;
return 0;
}int main(){
cin>>T;
for(int i=2;i<N;i++)lg[i]=lg[i>>1]+1;
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&dp[i][j][0]);
for(int l=1;l<L;l++)for(int i=1;i+(1<<l-1)<=n;i++)for(int j=1;j+(1<<l-1)<=m;j++)dp[i][j][l]=min(min(dp[i][j][l-1],dp[i+(1<<l-1)][j][l-1]),min(dp[i][j+(1<<l-1)][l-1],dp[i+(1<<l-1)][j+(1<<l-1)][l-1]));
for(l=0,r=min(n,m)+1;l+1<r;check(mid=l+r>>1)?l=mid:r=mid);
cout<<l<<'\n';
}return 0;
}