#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef double db; typedef pair pii; typedef vector vi; #define de(x) cout << #x << "=" << x << endl #define rep(i,a,b) for(int i=a;i<(b);++i) #define all(x) (x).begin(),(x).end() #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define fi first #define se second const int N = 1010; int T , n , m , a[N][N] , f[4][N][N]; typedef unsigned int ui; ui p[1010]; ui F(int x){return p[x];} void Gt(){ rep(i,1,n+1) rep(j,1,m+1) f[0][i][j] = f[2][i][j] = i; rep(i,1,n+1) rep(j,1,m+1) f[1][i][j] = f[3][i][j] = j; rep(i,1,n+1) if(i) rep(j,1,m+1) { while(f[2][i][j] != 1 && a[i][j] > a[f[2][i][j]-1][j]) f[2][i][j] = f[2][f[2][i][j]-1][j]; } for(int i=n-1;i>=1;--i) rep(j,1,m+1){ while(f[0][i][j] != n && a[i][j] > a[f[0][i][j]+1][j]) f[0][i][j] = f[0][f[0][i][j]+1][j]; } rep(i,1,n+1) rep(j,2,m+1){ while(f[3][i][j] != 1 && a[i][j] < a[i][f[3][i][j]-1]) f[3][i][j] = f[3][i][f[3][i][j]-1]; } rep(i,1,n+1) for(int j=m-1;j>=1;--j){ while(f[1][i][j] != m && a[i][j] < a[i][f[1][i][j]+1]) f[1][i][j] = f[1][i][f[1][i][j]+1]; } } int main(){ rep(i,1,1001){ ui x = 0; rep(j,1,i+1) x += j*(i-j+1); p[i]=x; } scanf("%d",&T); rep(i,0,T){ scanf("%d%d",&n,&m); rep(i,1,n+1) rep(j,1,m+1) scanf("%d",&a[i][j]); rep(i,1,n+1) rep(j,1,m+1) rep(d,0,4) f[d][i][j] = -1; unsigned int ans = 0; Gt(); rep(i,1,n+1) rep(j,1,m+1){ ui x = f[0][i][j]-i+1 , y = i-f[2][i][j]+1; ui c = F(x+y-1) - F(x-1) - F(y-1); x = f[1][i][j]-j+1 , y = j-f[3][i][j]+1; ui b = F(x+y-1) - F(x-1) - F(y-1); //cout << i << " " << j << " " << c << " " << b << " " << c*b << " " << endl; //rep(k,0,4) cout << f[k][i][j] << " ";cout << endl; ans += c*b*a[i][j]; } cout << ans << endl; } return 0; }