#include <bits/stdc++.h>
using namespace std;
const int mod = 565343;
const int maxn = 1e5 + 10;
int head[mod], Next[300003], Num[300003], tol;
long long to[300003];
int query(long long x) {
  long long k = (x % mod + mod) % mod;
  for (int i = head[k]; i != -1; i = Next[i])
    if (to[i] == x) return Num[i];
  return 0;
}
bool check(long long x, int C) {
  long long k = (x % mod + mod) % mod;
  for (int i = head[k]; i != -1; i = Next[i]) {
    if (to[i] == x) {
      Num[i] += C;
      return 1;
    }
  }
  return 0;
}
void add(long long x, int C) {
  long long k = (x % mod + mod) % mod;
  if (!check(x, C)) {
    to[tol] = x;
    Num[tol] = 1;
    Next[tol] = head[k];
    head[k] = tol++;
  }
}
struct node {
  int l, r, id;
} q[maxn];
int n, k, Q, t[maxn], a[maxn], b[maxn], len;
long long sum[maxn], txt[maxn], num[maxn], ans[maxn];
bool cmp(const node &A, const node &B) {
  if (b[A.l] == b[B.l])
    return A.r < B.r;
  else
    return b[A.l] < b[B.l];
}
void init() {
  for (int i = 565342;; i++) {
    int x = i, flag = 1;
    for (int j = 2; j * j <= x; j++) {
      if (x % j == 0) {
        flag = 0;
        break;
      }
    }
    if (flag) {
      printf("%d\n", i);
      return;
    }
  }
}
int main() {
  memset(head, -1, sizeof(head));
  scanf("%d%d", &n, &k);
  int unit = 700;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &t[i]);
    if (t[i] == 2) t[i] = -1;
    b[i] = i / unit + 1;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    sum[i] = sum[i - 1] + t[i] * a[i];
  }
  scanf("%d", &Q);
  for (int i = 1; i <= Q; i++) {
    scanf("%d%d", &q[i].l, &q[i].r);
    q[i].id = i;
  }
  sort(q + 1, q + Q + 1, cmp);
  int l = 0, r = 0;
  add(sum[0], 1);
  long long cnt = 0;
  for (int i = 1; i <= Q; i++) {
    node &e = q[i];
    while (r < e.r) {
      r++;
      cnt += query(sum[r] - k);
      add(sum[r], 1);
    }
    while (l > e.l) {
      l--;
      cnt += query(sum[l - 1] + k);
      add(sum[l - 1], 1);
    }
    while (l < e.l) {
      if (l == 0) {
        l++;
        continue;
      }
      add(sum[l - 1], -1);
      cnt -= query(sum[l - 1] + k);
      l++;
    }
    while (r > e.r) {
      add(sum[r], -1);
      cnt -= query(sum[r] - k);
      r--;
    }
    ans[e.id] = cnt;
  }
  for (int i = 1; i <= Q; i++) printf("%lld\n", ans[i]);
  return 0;
}
