#include <bits/stdc++.h>
using namespace std;
long long sqr(long long x) { return x * x; }
int mysqrt(long long x) {
  int l = 0, r = 1e9 + 1;
  while (r - l > 1) {
    int m = (l + r) / 2;
    if (m * (long long)m <= x)
      l = m;
    else
      r = m;
  }
  return l;
}
mt19937 rnd(1227);
mt19937_64 rndll(12365);
long long AR = 19, BR = 13, CR = 23, XR = 228, YR = 322, MODR = 1e9 + 993;
long long myrand() {
  long long ZR = (XR * AR + YR * BR + CR) % MODR;
  XR = YR;
  YR = ZR;
  return ZR;
}
int gcd(int a, int b) { return a ? gcd(b % a, a) : b; }
int gcdex(int a, int b, int &x, int &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  int x1, y1;
  int ret = gcdex(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return ret;
}
const int Mod = 1e9 + 7;
int Bpow(int x, int y) {
  int ret = 1;
  int w = x;
  while (y) {
    if (y & 1) ret = (ret * (long long)w) % Mod;
    w = (w * (long long)w) % Mod;
    y >>= 1;
  }
  return ret;
}
int Bdiv(int x) {
  int a, b;
  gcdex(x, Mod, a, b);
  if (a < 0) a += Mod;
  return a;
}
int Bdiv(int x, int y) { return (x * (long long)Bpow(y, Mod - 2)) % Mod; }
void setmin(int &x, int y) { x = min(x, y); }
void setmax(int &x, int y) { x = max(x, y); }
void setmin(long long &x, long long y) { x = min(x, y); }
void setmax(long long &x, long long y) { x = max(x, y); }
const long long llinf = 2e18 + 100;
const double eps = 1e-9;
const int maxn = (1 << 12) + 5, maxw = 1e6 + 100, inf = 2e9 + 100, sq = 300,
          mod = 1e9 + 7, LG = 17;
int q[maxn][101];
int n, m, zap;
int arr[maxn];
int p[maxn];
char mas[20];
int main() {
  scanf("%d%d%d", &n, &m, &zap);
  for (int i = n - 1; i >= 0; i--) scanf("%d", &arr[(1 << i)]);
  for (int i = 3; i < (1 << n); i++) {
    for (int j = 0; j < n; j++)
      if ((1 << j) & i) {
        arr[i] = arr[(1 << j)] + arr[i ^ (1 << j)];
        break;
      }
  }
  for (int i = 0; i < m; i++) {
    scanf("%s", mas);
    int w = 0;
    for (int j = 0; j < n; j++) w = 2 * w + mas[j] - 48;
    p[w]++;
  }
  for (int i = 0; i < (1 << n); i++) {
    for (int j = 0; j < (1 << n); j++) {
      int w = (1 << n) - 1 - (i ^ j);
      if (arr[w] <= 100) q[i][arr[w]] += p[j];
    }
    for (int j = 1; j <= 100; j++) q[i][j] += q[i][j - 1];
  }
  for (int i = 0; i < zap; i++) {
    int k;
    scanf("%s %d", mas, &k);
    int w = 0;
    for (int j = 0; j < n; j++) w = 2 * w + mas[j] - 48;
    printf("%d\n", q[w][k]);
  }
}
