#include <bits/stdc++.h>
#define int long long
#define ii pair<int,int>
#define nd second
#define st first
#define endl "\n"

using namespace std;
const int MOD = 1e9 + 7;
int n, k;
vector<int> a, pre;
vector<vector<int>> dp;
vector<ii> Q;
void add(int &x, int y)
{
    x += y;
    if (x >= MOD)
        x -= MOD;
    if (x < 0)
        x += MOD;
}
struct Trie{
    Trie *child[2];
    int sum;
};
struct Trie *getNode(void){
    Trie *x = new Trie();
    x->sum = 0;
    return x;
}
vector<Trie*> root;
void insert(int team, int XOR, int val){
    Trie *x = root[team];
    for (int i = 30; i >= 0; i--){
        int key = (XOR >> i) & 1;
        if (!x->child[key]) x->child[key] = getNode();
        x = x->child[key];
        add(x->sum, val);
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> k;
    a.resize(n + 2);
    pre.resize(n + 2);
    dp.resize(n + 2, vector<int>(k + 2));
    Q.resize(k + 2);
    root.resize(k + 2);
    for (int i = 0; i <= k; i++) root[i] = getNode();

    for (int i = 1; i <= n; i++) cin >> a[i], pre[i] = pre[i - 1] ^ a[i];
    for (int i = 1; i <= k; i++) cin >> Q[i].st >> Q[i].nd;
    insert(0, 0, 1);
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= min(i, k); j++){
            int l = Q[j].st - 1, r = Q[j].nd;
            int res = 0;
            Trie *x = root[j - 1];
            int bit;
            for (bit = 30; bit >= 0; bit--){
                int key = (r >> bit) & 1, k = (pre[i] >> bit) & 1;
                if (key && x->child[k]) add(res, x->child[k]->sum);
                if (!x->child[key ^ k]) break;
                x = x->child[key ^ k];    
            }
            if (bit == -1) add(res, x->sum);
            x = root[j - 1];
            if (l >= 0){
                for (bit = 30; bit >= 0; bit--){
                    int key = (l >> bit) & 1, k = (pre[i] >> bit) & 1;
                    if (key && x->child[k]) add(res, -x->child[k]->sum);
                    if (!x->child[key ^ k]) break;
                    x = x->child[key ^ k];
                }
                if (bit == -1) add(res, -x->sum);
            }
            dp[i][j] = res;
        }
        for (int j = 1; j <= min(i, k); j++)
            insert(j, pre[i], dp[i][j]);
    }
    cout << dp[n][k] << endl;

}