1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5, mod = 1e9 + 7;

int a[N], b[N];

struct node{
	int l, r;
	int add, mul;
} tree[N << 2];
#define lc (k * 2)
#define rc (k * 2 + 1)
#define mid (tree[k].l + tree[k].r >> 1)
node merge(node l, node r) {
	node res; res.l = l.l, res.r = r.r;
	res.add = (l.add * r.mul % mod + r.add) % mod;
	res.mul = l.mul * r.mul % mod;
	return res;
}
void pushup(int k) { tree[k] = merge(tree[lc], tree[rc]); }
void build(int k, int l, int r) {
	tree[k].l = l, tree[k].r = r;
	if(l == r) { if(a[l] <= 1) tree[k].mul = 1, tree[k].add = b[l]; else tree[k].add = 0, tree[k].mul = a[l]; return; }
	build(lc, l, mid), build(rc, mid + 1, r);
	pushup(k);
}
node query(int k, int l, int r) {
	if(tree[k].l >= l && tree[k].r <= r) return tree[k];
	if(r <= mid) return query(lc, l, r);
	else if(l > mid) return query(rc, l, r);
	else return merge(query(lc, l, mid), query(rc, mid + 1, r));
}
int nxt[N];
int pre[N];

void solve() {
	int n, q; cin >> n >> q;
	for(int i = 1; i <= n; i++) cin >> b[i] >> a[i];
	build(1, 1, n);
	for(int i = 1; i <= n; i++)
		pre[i] = pre[i - 1] + b[i];
	nxt[n + 1] = n + 1;
	for(int i = n; i >= 1; i--)
		if(a[i] >= 2) nxt[i] = i;
		else nxt[i] = nxt[i + 1];
	for(int i = 1; i <= q; i++) {
		int x, l, r; cin >> x >> l >> r;
		bool flag = 0; l++;
		while(!flag && l <= r) {
			if(a[l] >= 2) {
				x = max(x * a[l], x + b[l]);
				l++;
			} else {
				int xxx = min(r, nxt[l] - 1);
				x += pre[xxx] - pre[l - 1];
				l = xxx + 1;
			}
			if(x > mod) break;
		} x %= mod;
		if(l == r + 1) { cout << x << '\n'; continue; }
		auto p = query(1, l, r); x *= p.mul; x %= mod; x += p.add; x %= mod;
		cout << x << '\n';
	}
}

signed main() {
	ios::sync_with_stdio(false);
	ios_base::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	// For Problem with file IO
	// #ifndef CPH
	//   freopen(".in", "r", stdin);
	//   freopen(".out", "w", stdout);
	// #endif
	int t = 1;
	// cin >> t;
	while(t--) {
		solve();
	}
	return 0;
}