#include #define max(a, b) ((a) >= (b) ? (a) : (b)) #define DEBUG 0 #define NMAX 1111 char A[NMAX][NMAX]; int M, N; void ReadInput() { int i, j, K; scanf("%d %d %d", &M, &N, &K); for (; K > 0; K--) { scanf("%d %d", &i, &j); A[i][j] = 1; } for (i = 1; i <= M; i++) A[i][N + 1] = 1; } int h[NMAX], wmax[NMAX][NMAX], amax[NMAX][NMAX]; int stk[NMAX][2], nstk; void PreCompute() { int i, j, w, ii, cleft; for (i = 1; i <= M; i++) { nstk = 0; for (j = 1; j <= N + 1; j++) { if (A[i][j]) { h[j] = 0; while (nstk > 0) { ii = i - stk[nstk][0] + 1; w = j - stk[nstk][1]; //fprintf(stderr, "A i=%d j=%d h=%d w=%d\n", i, j, stk[nstk][0], w); wmax[ii][i] = max(wmax[ii][i], w); nstk--; } } else { h[j]++; cleft = j; while (nstk > 0 && stk[nstk][0] >= h[j]) { ii = i - stk[nstk][0] + 1; w = j - stk[nstk][1]; wmax[ii][i] = max(wmax[ii][i], w); //fprintf(stderr, "B i=%d j=%d h=%d w=%d\n", i, j, stk[nstk][0], w); cleft = stk[nstk][1]; nstk--; } nstk++; stk[nstk][0] = h[j]; stk[nstk][1] = cleft; //fprintf(stderr, "push i=%d j=%d h=%d cleft=%d\n", i, j, h[j], cleft); } } for (ii = 2; ii <= i; ii++) wmax[ii][i] = max(wmax[ii][i], wmax[ii - 1][i]); if (DEBUG) { for (ii = 1; ii <= i; ii++) fprintf(stderr, "wmax[%d-%d]=%d\n", ii, i, wmax[ii][i]); } amax[i][i] = wmax[i][i]; for (ii = i - 1; ii >= 1; ii--) { amax[ii][i] = max(amax[ii + 1][i], wmax[ii][i] * (i - ii + 1)); amax[ii][i] = max(amax[ii][i], amax[ii][i - 1]); } } } void ProcessQueries() { int Q, h, l; scanf("%d", &Q); while (Q--) { scanf("%d %d", &h, &l); printf("%d\n", amax[h][l]); } } int main() { //freopen("x.txt", "r", stdin); ReadInput(); PreCompute(); ProcessQueries(); return 0; }