#include #include #include #include using namespace std; const int N = 1010; unsigned int a[N][N], lt[N][N], rt[N][N], up[N][N], down[N][N]; unsigned int dp[N][N]; void read(unsigned int &n) { char c; while (1) { c = getchar(); if (isdigit(c)) break; } n = c - '0'; while (1) { c = getchar(); if (isdigit(c)) n = 10 * n + (c - '0'); else break; } } unsigned int cal(unsigned int n) { return 1LL * n * (n + 1) / 2; } unsigned int cal(unsigned int n, unsigned int first) { return 1LL * n * (first * 2 + n - 1) / 2; } unsigned int cal(unsigned int l, unsigned int m, unsigned int r) { return dp[m - l + 1][r - m + 1]; } int main() { for (int i = 1; i < N; i++) { for (int j = 1; j < N; j++) { dp[i][j] = dp[i][j - 1] + cal(i, j); } } int t; scanf("%d", &t); while (t--) { unsigned int n, m; read(n); read(m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) read(a[i][j]); // expand lt for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { lt[i][j] = j; while (lt[i][j] > 1 && a[i][j] < a[i][lt[i][j] - 1]) { lt[i][j] = lt[i][lt[i][j] - 1]; } } } // expand rt for (int i = 1; i <= n; i++) { for (int j = m; j >= 1; j--) { rt[i][j] = j; while (rt[i][j] < m && a[i][j] < a[i][rt[i][j] + 1]) { rt[i][j] = rt[i][rt[i][j] + 1]; } } } // expand up for (int j = 1; j <= m; j++) { for (int i = 1; i <= n; i++) { up[i][j] = i; while (up[i][j] > 1 && a[i][j] > a[up[i][j] - 1][j]) { up[i][j] = up[up[i][j] - 1][j]; } } } // expand down for (int j = 1; j <= m; j++) { for (int i = n; i >= 1; i--) { down[i][j] = i; while (down[i][j] < n && a[i][j] > a[down[i][j] + 1][j]) { down[i][j] = down[down[i][j] + 1][j]; } } } unsigned int sum = 0; for (unsigned int i = 1; i <= n; i++) { for (unsigned int j = 1; j <= m; j++) { // sum += cal(j - lt[i][j] + 1) * cal(rt[i][j] - j + 1) * cal(i - up[i][j] + 1) * cal(down[i][j] - i + 1) * a[i][j]; sum += cal(lt[i][j], j, rt[i][j]) * cal(up[i][j], i, down[i][j]) * a[i][j]; // cout << i << " " << j << " : " << cal(lt[i][j], j, rt[i][j]) << " " << cal(up[i][j], i, down[i][j]) << " " << cal(lt[i][j], j, rt[i][j]) * cal(up[i][j], i, down[i][j]) * a[i][j] << endl; } } printf("%u\n", sum); // for (int i = 1; i <= n; i++) // for (int j = 1; j <= m; j++) // printf("%d %d : %u %u %u %u\n", i, j, lt[i][j], rt[i][j], up[i][j], down[i][j]); } return 0; }