/* paiza POH! vol.2
* result:
* http://p...content-available-to-author-only...a.jp/poh/paizen/result/b86d786a8604d0245966f6caf3666192
* author: Leonardone @ NEETSDKASU
*/
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
{
Paiza.getInstance().resolve(new MyResolver());
}
}
{
private int[][] space2right = null;
private int[][] space2bottom = null;
private int[][] result = null;
private int[] maxSpace2right = null;
private int[] maxSpace2bottom = null;
private int[] space2rightLen = null;
private int[] space2bottomLen = null;
private int maxSpace2rightLen = 0;
private int maxSpace2bottomLen = 0;
@Override
public void setHome(Paiza.Home home) {
super.setHome(home);
int allSpaceCount = 0;
space2right = new int[home.getH()][home.getW()];
maxSpace2right = new int[home.getH()];
space2rightLen = new int[301];
maxSpace2rightLen = 0;
for (int y = 0; y < home.getH(); y++) {
int count = 0, max = 0;
for (int x = home.getW() - 1; x >= 0; x--) {
if (home.isSpace(x, y)) {
count++;
allSpaceCount++;
if (count > max) {
max = count;
}
} else {
if (count > 1) {
space2rightLen[count]++;
}
count = 0;
}
space2right[y][x] = count;
}
if (count > 1) {
space2rightLen[count]++;
}
maxSpace2right[y] = max;
if (max > maxSpace2rightLen) {
maxSpace2rightLen = max;
}
}
space2bottom = new int[home.getH()][home.getW()];
maxSpace2bottom = new int[home.getW()];
space2bottomLen = new int[301];
maxSpace2bottomLen = 0;
for (int x = 0; x < home.getW(); x++) {
int count = 0, max = 0;
for (int y = home.getH() - 1; y >= 0; y--) {
if (home.isSpace(x, y)) {
count++;
if (count > max) {
max = count;
}
} else {
if (count > 1) {
space2bottomLen[count]++;
}
count = 0;
}
space2bottom[y][x] = count;
}
if (count > 1) {
space2bottomLen[count]++;
}
maxSpace2bottom[x] = max;
if (max > maxSpace2bottomLen) {
maxSpace2bottomLen = max;
}
}
result = new int[301][301];
result[1][1] = allSpaceCount + 1;
}
@Override
public int resolve(Paiza.Widget widget) {
if (result[widget.getS()][widget.getT()] > 0) {
return result[widget.getS()][widget.getT()] - 1;
}
int count;
if (widget.getS() > widget.getT()) {
if (widget.getT() > 1) {
count = resolve2bottom(widget);
} else {
count = resolveVBar(widget);
}
} else {
if (widget.getS() > 1) {
count = resolve2right(widget);
} else {
count = resolveHBar(widget);
}
}
result[widget.getS()][widget.getT()] = count + 1;
return count;
}
private int resolveHBar(Paiza.Widget widget) {
int count = 0;
for (int i = widget.getT(); i <= maxSpace2rightLen; i++) {
count += space2rightLen[i] * (i - widget.getT() + 1);
}
return count;
}
private int resolveVBar(Paiza.Widget widget) {
int count = 0;
for (int i = widget.getS(); i <= maxSpace2bottomLen; i++) {
count += space2bottomLen[i] * (i - widget.getS() + 1);
}
return count;
}
private int resolve2right(Paiza.Widget widget) {
int count = 0;
for (int y = 0, ey = 0; y <= home.getH() - widget.getS(); y++) {
for (int yy = y + widget.getS() - 1; yy > ey; yy--) {
if (maxSpace2right[yy] < widget.getT()) {
y = yy;
ey = yy + 1;
break;
}
}
if (maxSpace2right[y] < widget.getT()) {
continue;
}
ey = y + widget.getS() - 1;
for (int x = 0; x <= home.getW() - widget.getT(); x++) {
if (space2bottom[y][x] >= widget.getS()) {
boolean placeable = true;
for (int dy = 0; placeable && dy < widget.getS(); dy++) {
if (space2right[y + dy][x] < widget.getT()) {
placeable = false;
x += space2right[y + dy][x];
}
}
if (placeable) {
count++;
}
} else if (space2right[y][x] < widget.getT()) {
x += space2right[y][x];
}
}
}
return count;
}
private int resolve2bottom(Paiza.Widget widget) {
int count = 0;
for (int x = 0, ex = 0; x <= home.getW() - widget.getT(); x++) {
for (int xx = x + widget.getT() - 1; xx > ex; xx--) {
if (maxSpace2bottom[xx] < widget.getS()) {
x = xx;
ex = xx + 1;
break;
}
}
if (maxSpace2bottom[x] < widget.getS()) {
continue;
}
ex = x + widget.getT() - 1;
for (int y = 0; y <= home.getH() - widget.getS(); y++) {
if (space2right[y][x] >= widget.getT()) {
boolean placeable = true;
for (int dx = 0; placeable && dx < widget.getT(); dx++) {
if (space2bottom[y][x + dx] < widget.getS()) {
placeable = false;
y += space2bottom[y][x + dx];
}
}
if (placeable) {
count++;
}
} else if (space2bottom[y][x] < widget.getS()) {
y += space2bottom[y][x];
}
}
}
return count;
}
}
final class Paiza
{
{
protected Paiza.Home home;
public void setHome(Paiza.Home home) {
this.home = home;
}
public abstract int resolve(Paiza.Widget widget);
}
public static Paiza getInstance
() throws java.
lang.
Exception { if (paiza == null) {
paiza = new Paiza();
}
return paiza;
}
public void resolve
(Resolver resolver
) { init(resolver);
for (Widget widget : widgets) {
answer(resolver.resolve(widget));
}
flush();
}
public final class Home
{
private final int H;
private final int W;
private int[][] display;
private Home(int H, int W) {
this.H = H;
this.W = W;
display = new int[H][W];
}
private void setDisplay
(int x,
int y,
int e
) throws java.
lang.
Exception { if (x < 0 || x >= W) {
}
if (y < 0 || y >= H) {
}
if (e != 0 && e != 1) {
}
display[y][x] = e;
}
public int getH() {
return H;
}
public int getW() {
return W;
}
public boolean isSpace(int x, int y) {
if (x < 0 || y < 0 || x >= W || y >= H) {
return false;
}
return display[y][x] == 0;
}
}
public final class Widget
{
private final int s;
private final int t;
private Widget(int s, int t) {
this.s = s;
this.t = t;
}
public int getS() {
return s;
}
public int getT() {
return t;
}
}
private static Paiza paiza = null;
private Home home;
private ArrayList<Widget> widgets;
String[] hw
= in.
readLine().
split(" "); for (int y = 0; y < home.getH(); y++) {
for (int x = 0; x < home.getW(); x++) {
home.setDisplay(x, y, (int)(line.charAt(x) - '0'));
}
}
int N
= Integer.
parseInt(in.
readLine()); widgets = new ArrayList<Widget>(N);
for (int i = 0; i< N; i++) {
String[] st
= in.
readLine().
split(" "); widgets.
add(new Widget
(Integer.
parseInt(st
[0]),
Integer.
parseInt(st
[1]))); }
}
private StringBuilder output = null;
private static final String NEWLINE
= System.
getProperty("line.separator");
resolver.setHome(home);
output = new StringBuilder(widgets.size() * 6);
}
private void answer(int count) {
output.append(count);
output.append(NEWLINE);
}
private void flush() {
}
}