#include #include #include #define left LEFT #define right RIGHT using namespace std; const int N = 1005; unsigned int f[N][N]; int a[N][N], left[N][N], right[N][N], up[N][N], down[N][N]; int n, m, test; void work() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &a[i][j]); } } for (int i = 1; i <= n; i++) { left[i][1] = 0; for (int j = 2; j <= m; j++) { int now = j - 1, value = a[i][j]; while (a[i][now] > value && now) { now = left[i][now]; } left[i][j] = now; } right[i][m] = m + 1; for (int j = m - 1; j >= 1; j--) { int now = j + 1, value = a[i][j]; while (a[i][now] > value && now != m + 1) { now = right[i][now]; } right[i][j] = now; } } for (int j = 1; j <= m; j++) { up[1][j] = 0; for (int i = 2; i <= n; i++) { int now = i - 1, value = a[i][j]; while (a[now][j] < value && now) { now = up[now][j]; } up[i][j] = now; } down[n][j] = n + 1; for (int i = n - 1; i >= 1; i--) { int now = i + 1, value = a[i][j]; while (a[now][j] < value && now != n + 1) { now = down[now][j]; } down[i][j] = now; } } unsigned int ans = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { ans += a[i][j] * (f[i - up[i][j] - 1][down[i][j] - i - 1] * f[j - left[i][j] - 1][right[i][j] - j - 1]); //printf("%d %d %d %d\n", up[i][j], down[i][j], left[i][j], right[i][j]); } } printf("%u\n", ans); } int main() { for (int i = 0; i <= 1000; i++) { f[i][0] = (i + 1) * (i + 2) / 2; unsigned int vNow = f[i][0]; for (int j = 1; j <= 1000; j++) { vNow += (i + 1); f[i][j] = f[i][j - 1] + vNow; } } scanf("%d", &test); while (test--) { work(); } return 0; }