#include #include #include using namespace std; #define ll long long #define INF 1111111111 #define CT 6001111 int **grid = new int*[411]; int **DR = new int*[411]; int **D = new int*[411]; int **R = new int*[411]; int **DL = new int*[411]; int ct[CT]; int n, m; int main() { int q; scanf("%d%d%d", &n, &m, &q); // initialize stuff for (int i = 0; i <= n; i++) { D[i] = new int[m+1]; R[i] = new int[m+1]; for (int j = 0; j <= m; j++) { D[i][j] = R[i][j] = 0; } } // compute all row / column cumulative sums for (int i = 0; i < n; i++) { grid[i] = new int[m]; for (int j = 0; j < m; j++) { scanf("%d", &grid[i][j]); D[i+1][j] = grid[i][j] + D[i][j]; R[i][j+1] = grid[i][j] + R[i][j]; } } // compute all triangle sums for (int i = 0, i1 = 1, ni = n; i < n; i++, i1++, ni--) { for (int j = 0, j1 = 1, mj = m; j < m; j++, j1++, mj--) { int g = grid[i][j]; for (int k = 1, ik = i-1, s = g, L = min(i1, mj); k < L; k++, ik--) ct[s += R[ik][j1+k] - R[ik][j]]++; for (int k = 1, ik = i+1, s = g, L = min(ni, mj); k < L; k++, ik++) ct[s += R[ik][j1+k] - R[ik][j]]++; for (int k = 1, ik = i-1, s = g, L = min(i1, j1); k < L; k++, ik--) ct[s += R[ik][j1] - R[ik][j-k]]++; for (int k = 1, ik = i+1, s = g, L = min(ni, j1); k < L; k++, ik++) ct[s += R[ik][j1] - R[ik][j-k]]++; for (int k = 1, ik = i-1, s = g, L = min(i1, min(j1, mj)); k < L; k++, ik--) ct[s += R[ik][j1+k] - R[ik][j-k]]++; for (int k = 1, ik = i+1, s = g, L = min(ni, min(j1, mj)); k < L; k++, ik++) ct[s += R[ik][j1+k] - R[ik][j-k]]++; for (int k = 1, jk = j-1, s = g, L = min(j1, min(i1, ni)); k < L; k++, jk--) ct[s += D[i1+k][jk] - D[i-k][jk]]++; for (int k = 1, jk = j+1, s = g, L = min(mj, min(i1, ni)); k < L; k++, jk++) ct[s += D[i1+k][jk] - D[i-k][jk]]++; } } // compute all prefix sums of triangle sums vector ans; ans.push_back(0); for (int i = 1; i < CT; i++) { while (ct[i]--) { int v = ans.back() + i; ans.push_back(v); if (v >= INF) break; } if (ans.back() >= INF) break; } // answer queries while (q--) { int g; scanf("%d", &g); int L = 0, R = ans.size(); // binary search while (R - L > 1) { int M = L + R >> 1; (ans[M] <= g ? L : R) = M; } printf("%d\n", L); } }