#include using namespace std; using ll = long long; //2次元累積和 template< class T > struct CumulativeSum2D{ vector> data; CumulativeSum2D(int H, int W) : data(H + 1, vector(W + 1, 0)) {} void add(int y, int x, T z){ y++, x++; if(y >= data.size() || x >= data[0].size())return; data[y][x] += z; } void build(){ for(int i = 1; i < data.size(); i++) { for(int j = 1; j < data[i].size(); j++) { data[i][j] += data[i][j - 1] + data[i - 1][j] - data[i - 1][j - 1]; } } } T query(int sy, int sx, int gy, int gx){ return (data[gy][gx] - data[sy][gx] - data[gy][sx] + data[sy][sx]); } }; //2次元imos法 template struct imos2D{ vector> data; imos2D(int H, int W) : data(H + 1, vector(W + 1, 0)) {} void add(int sy, int sx, int gy, int gx, T z){ data[gy][gx] += z; data[sy][gx] -= z; data[gy][sx] -= z; data[sy][sx] += z; } void build(){ for(int i = 0; i < data.size(); i++) { for(int j = 1; j < data[i].size(); j++) { data[i][j] += data[i][j - 1]; } } for(int i = 0; i < data[0].size(); i++) { for(int j = 1; j < data.size(); j++) { data[j][i] += data[j - 1][i]; } } } T query(int y, int x){ return data[y][x]; } }; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; CumulativeSum2D A(m, m); imos2D B(m, m); for(int y = 0; y < m; y++){ for(int x = 0; x < m; x++){ int v; cin >> v; A.add(y, x, v); } } A.build(); for(int ly = 0; ly < m; ly++){ for(int ry = ly + 1; ry <= m; ry++){ ll s = 0; vector> temp(m + 1); for(int x = 1; x <= m; x++){ temp[x] = make_pair(A.query(ly, 0, ry, x), x); } sort(temp.begin(), temp.end()); for(int i = 0; i < m; ){ int p = i; while(i <= m && temp[i].first == temp[p].first) i++; for(int j = p; j < i; j++){ for(int k = j + 1; k < i; k++){ B.add(ly, temp[j].second, ry, temp[k].second, 1); } } } } } B.build(); for(int i = 0; i < n; i++){ int y, x; cin >> y >> x; y--, x--; cout << B.query(y, x) << '\n'; } }