rt
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 3e5 + 30;
const int MOD = 1e9 + 7;
inline int read()
{
int x = 0; char ch = getchar();
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) x = x * 10 + (ch - 48), ch = getchar();
return x;
}
inline void write (int x)
{
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar (x % 10 + 48);
}
int n, m, a[MAXN];
inline void input()
{
n = read(), m = read();
for (register int i = 1; i <= n; ++ i) a[i] = read();
}
int k;
struct Tree { int b, c, d; }T[MAXN << 5]; int lc[MAXN << 5], rc[MAXN << 5], tot, rt[MAXN];
inline void push_up (int cur)
{
T[cur].b = (T[lc[cur]].b + T[rc[cur]].b) % MOD;
T[cur].c = (T[lc[cur]].c + T[rc[cur]].c) % MOD;
T[cur].d = (T[lc[cur]].d + T[rc[cur]].d) % MOD;
}
int build (int l, int r)
{
int cur = ++ tot;
if (l == r)
{
if (l == 0) return cur;
else return T[cur].b = 1, T[cur].c = (-a[l] - a[l + 1]) % MOD, T[cur].d = a[l] * a[l + 1] % MOD, cur;
}
int mid = l + r >> 1;
lc[cur] = build(l, mid), rc[cur] = build(mid + 1, r);
return push_up(cur), cur;
}
inline void init()
{
sort(a + 1, a + n + 1), k = unique(a + 1, a + n + 1) - a - 1;
rt[0] = build(0, n);
}
void insert (int pre, int &cur, int l, int r, int pos)
{
bool flag = false;
if (cur == pre or !cur) flag = true;
if (flag) cur = ++ tot, T[cur] = T[pre];
if (l == r) return (void)(T[cur].b = -T[cur].b, T[cur].c = -T[cur].c, T[cur].d = -T[cur].d);
if (flag) lc[cur] = lc[pre], rc[cur] = rc[pre];
int mid = l + r >> 1;
if (pos <= mid) insert(lc[pre], lc[cur], l, mid, pos);
else insert(rc[pre], rc[cur], mid + 1, r, pos);
push_up (cur);
}
int query (int cur, int l, int r, int L, int R, int x)
{
if (L <= l and r <= R) return (T[cur].b * x % MOD * x + T[cur].c * x + T[cur].d) % MOD;
int mid = l + r >> 1, res = 0;
if (lc[cur] and L <= mid) res = query(lc[cur], l, mid, L, R, x);
if (rc[cur] and R > mid) res += query(rc[cur], mid + 1, r, L, R, x);
return res % MOD;
}
inline void work()
{
for (register int i = 1, pos; i <= k; ++ i)
insert(rt[i - 1], rt[i], 0, n, ((pos = lower_bound(a + 1, a + k + 1, a[i]) - a - 1 + 1) - 1)), insert(rt[i - 1], rt[i], 0, n, pos);
int last = 0;
while (m --)
{
int x = read() ^ last, l = read() ^ last, r = read() ^ last;
int ans = (query(rt[upper_bound(a + 1, a + k + 1, x) - a - 1], 0, n, l, r - 1, x) + MOD) % MOD;
write(ans), putchar('\n');
last = ans;
}
}
signed main()
{
input();
init();
work();
return 0;
}