#include <bits/stdc++.h>
using namespace std;
struct rua {
  int l, x, id;
} q[100001];
int n, Q, _, cnt, a[100001], v[21], res[100001];
bool cmp(rua x, rua y) { return x.l < y.l; }
long long qow(long long x, long long y) {
  return y ? (y & 1 ? x * qow(x, y - 1) % 1000000007
                    : qow(x * x % 1000000007, y / 2))
           : 1;
}
void insert(int x) {
  int k = 0, p = -1;
  while ((1 << k) <= x) k++;
  k--;
  for (int i = k; i >= 0; i--)
    if (v[i])
      x = min(x, x ^ v[i]);
    else if ((1 << i) <= x) {
      v[i] = x, p = i;
      break;
    }
  if (p != -1) {
    for (int i = p + 1; i < 20; i++) v[i] = min(v[i], v[i] ^ v[p]);
    for (int i = p - 1; i >= 0; i--) v[p] = min(v[p], v[i] ^ v[p]);
  }
  if (!x || (p != -1 && !v[p])) cnt++;
}
bool find(int x) {
  for (int i = 19; i >= 0; i--) x = min(x, x ^ v[i]);
  return !x;
}
int main() {
  scanf("%d%d", &n, &Q);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= Q; i++) scanf("%d%d", &q[i].l, &q[i].x), q[i].id = i;
  sort(q + 1, q + Q + 1, cmp);
  for (int i = 1; i <= Q; i++) {
    while (_ < q[i].l) insert(a[++_]);
    res[q[i].id] = find(q[i].x) ? qow(2, cnt) : 0;
  }
  for (int i = 1; i <= Q; i++) printf("%d\n", res[i]);
  return 0;
}
