/* paiza POH!vol.2
* result:
* http://p...content-available-to-author-only...a.jp/poh/paizen/result/c5279346a6edcb14903fd1874bfd9ce0
* author: Leonardone @ NEETSDKASU
*/
#include <stdio.h>
#define SIZE (9000000)
char input[SIZE];
char *ptr = input;
int getInt(void) {
int v = 0;
while (*ptr < '0' || *ptr > '9') ++ptr;
while (*ptr >= '0' && *ptr <= '9')
{
v = 10 * v + (int)(*ptr - '0');
++ptr;
}
return v;
}
char getChar(void) {
while (*ptr < '0' || *ptr > '9') ++ptr;
return *ptr++;
}
void putInt(int v) {
if (v < 10) {
} else {
putInt(v / 10);
}
}
int home[310][310];
int hoge[310][310];
int result[310][310];
int startXm[310];
int startYm[310];
int main(void) {
int H, W, N, s, t;
int x, y, c, i, j;
int hx, hy, hxe, hye;
int count, dy, dx;
char ch;
fread(input
, sizeof(char), SIZE
, stdin
); H = getInt();
W = getInt();
for (y = 0; y < H; ++y) {
c = 0;
for (x = 0; x < W; ++x) {
ch = getChar();
if (ch == '0') {
c++;
if (y) {
hoge[y][x] = hoge[y - 1][x] + 1;
} else {
hoge[y][x] = 1;
}
startXm[c] = x;
startYm[c] = y;
} else {
c = 0;
hoge[y][x] = 0;
}
home[y][x] = c;
}
}
N = getInt();
if (W > H) {
for (i = 0; i < N; ++i) {
s = getInt();
t = getInt();
if (s > H || t > W) {
continue;
}
if (result[s][t]) {
putInt(result[s][t] - 1);
continue;
}
hye = s - 1;
hxe = t - 1;
count = 0;
hx = startXm[t];
hy = startYm[t];
for (j = t + 1; j < 301; ++j) {
if (startYm[j] > hy) {
hy = startYm[j];
hx = startXm[j];
}
}
for (; hy >= hye; --hy) {
for (; hx >= hxe; --hx) {
if (home[hy][hx] < t) {
hx -= home[hy][hx];
continue;
}
if (hoge[hy][hx] < s) {
continue;
}
for (dy = 1; dy < s; ++dy) {
y = hy - dy;
if (y < 0) {
break;
}
if (home[y][hx] < t) {
break;
}
}
if (dy == s) {
count++;
}
}
hx = W - 1;
}
putInt(count);
result[s][t] = count + 1;
}
} else {
for (i = 0; i < N; ++i) {
s = getInt();
t = getInt();
if (s > H || t > W) {
continue;
}
if (result[s][t]) {
putInt(result[s][t] - 1);
continue;
}
hye = s - 1;
hxe = t - 1;
count = 0;
hx = startXm[t];
hy = startYm[t];
for (j = t + 1; j < 301; ++j) {
if (startXm[j] > hx) {
hy = startYm[j];
hx = startXm[j];
}
}
for (; hx >= hxe; --hx) {
for (; hy >= hye; --hy) {
if (home[hy][hx] < t) {
continue;
}
if (hoge[hy][hx] < s) {
hy -= hoge[hy][hx];
continue;
}
for (dy = 1; dy < s; ++dy) {
y = hy - dy;
if (y < 0) {
break;
}
if (home[y][hx] < t) {
break;
}
}
if (dy == s) {
count++;
}
}
hy = H - 1;
}
putInt(count);
result[s][t] = count + 1;
}
}
return 0;
}
LyogcGFpemEgUE9IIXZvbC4yCiAqIHJlc3VsdDoKICogaHR0cDovL3AuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEuanAvcG9oL3BhaXplbi9yZXN1bHQvYzUyNzkzNDZhNmVkY2IxNDkwM2ZkMTg3NGJmZDljZTAKICogYXV0aG9yOiBMZW9uYXJkb25lIEAgTkVFVFNES0FTVQogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFNJWkUgKDkwMDAwMDApCgpjaGFyIGlucHV0W1NJWkVdOwpjaGFyICpwdHIgPSBpbnB1dDsKCmludCBnZXRJbnQodm9pZCkgewoJaW50IHYgPSAwOwoJd2hpbGUgKCpwdHIgPCAnMCcgfHwgKnB0ciA+ICc5JykgKytwdHI7Cgl3aGlsZSAoKnB0ciA+PSAnMCcgJiYgKnB0ciA8PSAnOScpCgl7CgkJdiA9IDEwICogdiArIChpbnQpKCpwdHIgLSAnMCcpOwoJCSsrcHRyOwoJfQoJcmV0dXJuIHY7Cn0KCmNoYXIgZ2V0Q2hhcih2b2lkKSB7Cgl3aGlsZSAoKnB0ciA8ICcwJyB8fCAqcHRyID4gJzknKSArK3B0cjsKCXJldHVybiAqcHRyKys7Cn0KCnZvaWQgcHV0SW50KGludCB2KSB7CglpZiAodiA8IDEwKSB7CgkJcHV0Y2hhcignMCcgKyAoY2hhcil2KTsKCX0gZWxzZSB7CgkJcHV0SW50KHYgLyAxMCk7CgkJcHV0Y2hhcignMCcgKyAoY2hhcikodiAlIDEwKSk7Cgl9Cn0KCmludCBob21lWzMxMF1bMzEwXTsKaW50IGhvZ2VbMzEwXVszMTBdOwppbnQgcmVzdWx0WzMxMF1bMzEwXTsKCmludCBzdGFydFhtWzMxMF07CmludCBzdGFydFltWzMxMF07CgppbnQgbWFpbih2b2lkKSB7CglpbnQgSCwgVywgTiwgcywgdDsKCWludCB4LCB5LCBjLCBpLCBqOwoJaW50IGh4LCBoeSwgaHhlLCBoeWU7CglpbnQgY291bnQsIGR5LCBkeDsKCWNoYXIgY2g7CgkKCWZyZWFkKGlucHV0LCBzaXplb2YoY2hhciksIFNJWkUsIHN0ZGluKTsKCUggPSBnZXRJbnQoKTsKCVcgPSBnZXRJbnQoKTsKCQoJZm9yICh5ID0gMDsgeSA8IEg7ICsreSkgewoJCWMgPSAwOwoJCWZvciAoeCA9IDA7IHggPCBXOyArK3gpIHsKCQkJY2ggPSBnZXRDaGFyKCk7CgkJCWlmIChjaCA9PSAnMCcpIHsKCQkJCWMrKzsKCQkJCWlmICh5KSB7CgkJCQkJaG9nZVt5XVt4XSA9IGhvZ2VbeSAtIDFdW3hdICsgMTsKCQkJCX0gZWxzZSB7CgkJCQkJaG9nZVt5XVt4XSA9IDE7CgkJCQl9CgkJCQlzdGFydFhtW2NdID0geDsKCQkJCXN0YXJ0WW1bY10gPSB5OwoJCQl9IGVsc2UgewoJCQkJYyA9IDA7CgkJCQlob2dlW3ldW3hdID0gMDsKCQkJfQoJCQlob21lW3ldW3hdID0gYzsKCQl9Cgl9CgkKCU4gPSBnZXRJbnQoKTsKCQoKCWlmIChXID4gSCkgewoJCWZvciAoaSA9IDA7IGkgPCBOOyArK2kpIHsKCQkJcyA9IGdldEludCgpOwoJCQl0ID0gZ2V0SW50KCk7CgkJCQoJCQlpZiAocyA+IEggfHwgdCA+IFcpIHsKCQkJCXB1dGNoYXIoJzAnKTsKCQkJCXB1dGNoYXIoJ1xuJyk7CgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJaWYgKHJlc3VsdFtzXVt0XSkgewoJCQkJcHV0SW50KHJlc3VsdFtzXVt0XSAtIDEpOwoJCQkJcHV0Y2hhcignXG4nKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQoJCQloeWUgPSBzIC0gMTsKCQkJaHhlID0gdCAtIDE7CgkJCWNvdW50ID0gMDsKCgkJCWh4ID0gc3RhcnRYbVt0XTsKCQkJaHkgPSBzdGFydFltW3RdOwoJCQlmb3IgKGogPSB0ICsgMTsgaiA8IDMwMTsgKytqKSB7CgkJCQlpZiAoc3RhcnRZbVtqXSA+IGh5KSB7CgkJCQkJaHkgPSBzdGFydFltW2pdOwoJCQkJCWh4ID0gc3RhcnRYbVtqXTsKCQkJCX0KCQkJfQoJCQlmb3IgKDsgaHkgPj0gaHllOyAtLWh5KSB7CgkJCQlmb3IgKDsgaHggPj0gaHhlOyAtLWh4KSB7CgkJCQkJaWYgKGhvbWVbaHldW2h4XSA8IHQpIHsKCQkJCQkJaHggLT0gaG9tZVtoeV1baHhdOwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJaWYgKGhvZ2VbaHldW2h4XSA8IHMpIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCWZvciAoZHkgPSAxOyBkeSA8IHM7ICsrZHkpIHsKCQkJCQkJeSA9IGh5IC0gZHk7CgkJCQkJCWlmICh5IDwgMCkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJaWYgKGhvbWVbeV1baHhdIDwgdCkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKGR5ID09IHMpIHsKCQkJCQkJY291bnQrKzsKCQkJCQl9CgkJCQl9CgkJCQloeCA9IFcgLSAxOwoJCQl9CgkJCXB1dEludChjb3VudCk7CgkJCXB1dGNoYXIoJ1xuJyk7CgkJCXJlc3VsdFtzXVt0XSA9IGNvdW50ICsgMTsKCQl9Cgl9IGVsc2UgewoJCWZvciAoaSA9IDA7IGkgPCBOOyArK2kpIHsKCQkJcyA9IGdldEludCgpOwoJCQl0ID0gZ2V0SW50KCk7CgkJCQoJCQlpZiAocyA+IEggfHwgdCA+IFcpIHsKCQkJCXB1dGNoYXIoJzAnKTsKCQkJCXB1dGNoYXIoJ1xuJyk7CgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJaWYgKHJlc3VsdFtzXVt0XSkgewoJCQkJcHV0SW50KHJlc3VsdFtzXVt0XSAtIDEpOwoJCQkJcHV0Y2hhcignXG4nKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQoJCQloeWUgPSBzIC0gMTsKCQkJaHhlID0gdCAtIDE7CgkJCWNvdW50ID0gMDsKCQkJaHggPSBzdGFydFhtW3RdOwoJCQloeSA9IHN0YXJ0WW1bdF07CgkJCWZvciAoaiA9IHQgKyAxOyBqIDwgMzAxOyArK2opIHsKCQkJCWlmIChzdGFydFhtW2pdID4gaHgpIHsKCQkJCQloeSA9IHN0YXJ0WW1bal07CgkJCQkJaHggPSBzdGFydFhtW2pdOwoJCQkJfQoJCQl9CgkJCWZvciAoOyBoeCA+PSBoeGU7IC0taHgpIHsKCQkJCWZvciAoOyBoeSA+PSBoeWU7IC0taHkpIHsKCQkJCQlpZiAoaG9tZVtoeV1baHhdIDwgdCkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJaWYgKGhvZ2VbaHldW2h4XSA8IHMpIHsKCQkJCQkJaHkgLT0gaG9nZVtoeV1baHhdOwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJZm9yIChkeSA9IDE7IGR5IDwgczsgKytkeSkgewoJCQkJCQl5ID0gaHkgLSBkeTsKCQkJCQkJaWYgKHkgPCAwKSB7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlpZiAoaG9tZVt5XVtoeF0gPCB0KSB7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoZHkgPT0gcykgewoJCQkJCQljb3VudCsrOwoJCQkJCX0KCQkJCX0KCQkJCWh5ID0gSCAtIDE7CgkJCX0KCQkJcHV0SW50KGNvdW50KTsKCQkJcHV0Y2hhcignXG4nKTsKCQkJcmVzdWx0W3NdW3RdID0gY291bnQgKyAxOwoJCX0KCX0KCQoJcmV0dXJuIDA7Cn0K