#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 1e9 + 7;
const int N = 1e5 + 5;
const int K = 1e5 + 5;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
if (a < 0) a += MOD;
}
struct Trie {
struct Node {
int nxt[2];
int sum = 0; // tổng val
Node() {
memset(nxt, -1, sizeof nxt);
}
};
vector<Node> trie;
Trie() {
trie = vector<Node>(1);
}
// Số nguyên x mang theo giá trị val
void addNumber(int x, int val) {
int v = 0;
for (int i = 29; i >= 0; i--) {
int c = (x >> i) & 1;
if (trie[v].nxt[c] == -1) {
trie[v].nxt[c] = trie.size();
trie.push_back(Node());
}
v = trie[v].nxt[c];
add(trie[v].sum, val);
}
}
// Tính tổng val của các số y có trong cây trie sao cho y ^ x <= mx
int getSum(int x, int mx) {
int v = 0, ans = 0;
for (int i = 29; i >= 0; i--) {
int c = (x >> i) & 1, max_c = (mx >> i) & 1;
int nxt_v0 = trie[v].nxt[c], nxt_v1 = trie[v].nxt[c ^ 1];
if (max_c == 0) {
v = nxt_v0;
}
else {
if (nxt_v0 != -1) add(ans, trie[nxt_v0].sum);
v = nxt_v1;
}
if (v == -1) break;
}
if (v != -1) add(ans, trie[v].sum);
return ans;
}
};
Trie trie[K];
int n, k;
int a[N], pref_xor[N];
int l[K], r[K];
vector<int> dp[N]; // dp[i][j] = Số cách chia đoạn [1, i] thành j đoạn con liên tiếp thoả mãn điều kiện
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= k; i++) cin >> l[i] >> r[i];
for (int i = 1; i <= n; i++) {
pref_xor[i] = pref_xor[i - 1] ^ a[i];
}
for (int i = 0; i <= n; i++) {
dp[i] = vector<int>(k + 1, 0);
}
dp[0][0] = 1;
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <= k; j++) {
// for (int prev_i = 0; prev_i < i; prev_i++) {
// int sum_xor = pref_xor[i] ^ pref_xor[prev_i];
// if (l[j] <= sum_xor && sum_xor <= r[j]) {
// add(dp[i][j], dp[prev_i][j - 1]);
// }
// }
// }
// }
trie[0].addNumber(pref_xor[0], dp[0][0]);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
int sum_dp = trie[j - 1].getSum(pref_xor[i], r[j]);
add(sum_dp, -trie[j - 1].getSum(pref_xor[i], l[j] - 1));
add(dp[i][j], sum_dp);
}
for (int j = 1; j <= k; j++) {
trie[j].addNumber(pref_xor[i], dp[i][j]);
}
}
cout << dp[n][k] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7ICAKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKY29uc3QgaW50IEsgPSAxZTUgKyA1OyAKCnZvaWQgYWRkKGludCYgYSwgaW50IGIpIHsKCWEgKz0gYjsgCglpZiAoYSA+PSBNT0QpIGEgLT0gTU9EOyAKCWlmIChhIDwgMCkgYSArPSBNT0Q7IAp9CgpzdHJ1Y3QgVHJpZSB7CQoJc3RydWN0IE5vZGUgewoJCWludCBueHRbMl07IAoJCWludCBzdW0gPSAwOyAvLyB04buVbmcgdmFsCgoJCU5vZGUoKSB7CgkJCW1lbXNldChueHQsIC0xLCBzaXplb2Ygbnh0KTsgCgkJfQoJfTsgCgoJdmVjdG9yPE5vZGU+IHRyaWU7ICAKCglUcmllKCkgewoJCXRyaWUgPSB2ZWN0b3I8Tm9kZT4oMSk7IAoJfQoKCS8vIFPhu5Egbmd1ecOqbiB4IG1hbmcgdGhlbyBnacOhIHRy4buLIHZhbAoJdm9pZCBhZGROdW1iZXIoaW50IHgsIGludCB2YWwpIHsKCQlpbnQgdiA9IDA7ICAKCQlmb3IgKGludCBpID0gMjk7IGkgPj0gMDsgaS0tKSB7CgkJCWludCBjID0gKHggPj4gaSkgJiAxOyAKCQkJaWYgKHRyaWVbdl0ubnh0W2NdID09IC0xKSB7CgkJCQl0cmllW3ZdLm54dFtjXSA9IHRyaWUuc2l6ZSgpOyAKCQkJCXRyaWUucHVzaF9iYWNrKE5vZGUoKSk7IAoJCQl9CgkJCXYgPSB0cmllW3ZdLm54dFtjXTsKCQkJYWRkKHRyaWVbdl0uc3VtLCB2YWwpOyAKCQl9Cgl9CgoJLy8gVMOtbmggdOG7lW5nIHZhbCBj4bunYSBjw6FjIHPhu5EgeSBjw7MgdHJvbmcgY8OieSB0cmllIHNhbyBjaG8geSBeIHggPD0gbXgKCWludCBnZXRTdW0oaW50IHgsIGludCBteCkgewoJCWludCB2ID0gMCwgYW5zID0gMDsgCgkJZm9yIChpbnQgaSA9IDI5OyBpID49IDA7IGktLSkgewoJCQlpbnQgYyA9ICh4ID4+IGkpICYgMSwgbWF4X2MgPSAobXggPj4gaSkgJiAxOyAgCgkJCWludCBueHRfdjAgPSB0cmllW3ZdLm54dFtjXSwgbnh0X3YxID0gdHJpZVt2XS5ueHRbYyBeIDFdOyAKCQkJaWYgKG1heF9jID09IDApIHsKCQkJCXYgPSBueHRfdjA7ICAgCgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAobnh0X3YwICE9IC0xKSBhZGQoYW5zLCB0cmllW254dF92MF0uc3VtKTsgCgkJCQl2ID0gbnh0X3YxOyAKCQkJfQoJCQlpZiAodiA9PSAtMSkgYnJlYWs7IAoJCX0KCQlpZiAodiAhPSAtMSkgYWRkKGFucywgdHJpZVt2XS5zdW0pOyAKCQkKCQlyZXR1cm4gYW5zOyAKCX0KfTsgCgpUcmllIHRyaWVbS107CgppbnQgbiwgazsgIAppbnQgYVtOXSwgcHJlZl94b3JbTl07IAppbnQgbFtLXSwgcltLXTsgCnZlY3RvcjxpbnQ+IGRwW05dOyAvLyBkcFtpXVtqXSA9IFPhu5EgY8OhY2ggY2hpYSDEkW/huqFuIFsxLCBpXSB0aMOgbmggaiDEkW/huqFuIGNvbiBsacOqbiB0aeG6v3AgdGhv4bqjIG3Do24gxJFp4buBdSBraeG7h24KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuID4+IGs7IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gYVtpXTsgCglmb3IgKGludCBpID0gMTsgaSA8PSBrOyBpKyspIGNpbiA+PiBsW2ldID4+IHJbaV07CgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJcHJlZl94b3JbaV0gPSBwcmVmX3hvcltpIC0gMV0gXiBhW2ldOyAKCX0KCglmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKCQlkcFtpXSA9IHZlY3RvcjxpbnQ+KGsgKyAxLCAwKTsgCgl9CglkcFswXVswXSA9IDE7ICAKCgkvLyBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCS8vIAlmb3IgKGludCBqID0gMTsgaiA8PSBrOyBqKyspIHsKCS8vIAkJZm9yIChpbnQgcHJldl9pID0gMDsgcHJldl9pIDwgaTsgcHJldl9pKyspIHsKCS8vIAkJCWludCBzdW1feG9yID0gcHJlZl94b3JbaV0gXiBwcmVmX3hvcltwcmV2X2ldOyAgCgkvLyAJCQlpZiAobFtqXSA8PSBzdW1feG9yICYmIHN1bV94b3IgPD0gcltqXSkgewoJLy8gCQkJCWFkZChkcFtpXVtqXSwgZHBbcHJldl9pXVtqIC0gMV0pOyAKCS8vIAkJCX0KCS8vIAkJfQoJLy8gCX0KCS8vIH0JCgoJdHJpZVswXS5hZGROdW1iZXIocHJlZl94b3JbMF0sIGRwWzBdWzBdKTsgCgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDE7IGogPD0gazsgaisrKSB7CgkJCWludCBzdW1fZHAgPSB0cmllW2ogLSAxXS5nZXRTdW0ocHJlZl94b3JbaV0sIHJbal0pOyAKCQkJYWRkKHN1bV9kcCwgLXRyaWVbaiAtIDFdLmdldFN1bShwcmVmX3hvcltpXSwgbFtqXSAtIDEpKTsgCgkJCWFkZChkcFtpXVtqXSwgc3VtX2RwKTsgCgkJfQoJCWZvciAoaW50IGogPSAxOyBqIDw9IGs7IGorKykgewoJCQl0cmllW2pdLmFkZE51bWJlcihwcmVmX3hvcltpXSwgZHBbaV1bal0pOyAKCQl9Cgl9CgoJY291dCA8PCBkcFtuXVtrXSA8PCAnXG4nOyAKfQ==