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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int mod = 1e9 + 7;
struct mint {
	int x;
	mint() : x(0) {}
	mint(int x) : x(x) {}
	mint operator+(const int &ot) const { return x >= mod - ot ? x - mod + ot : x + ot; }
	mint operator-(const int &ot) const { return x < ot ? x - ot + mod : x - ot; }
	mint operator*(const int &ot) const { return 1ll * x * ot % mod; }
	mint operator+=(int ot) { return *this = *this + ot; }
	mint operator-=(int ot) { return *this = *this - ot; }
	mint operator*=(int ot) { return *this = *this * ot; }
	mint pow(ll k) {
		mint a = x, r = 1;
		for (; k; k >>= 1) {
			if (k & 1) r *= a;
			a *= a;
		}
		return r;
	}
	mint inv() {
		return pow(mod - 2);
	}
	operator int() { return x; }
};

int main() {
	cin.tie(0); ios_base::sync_with_stdio(0);
	int n, q;
	cin >> n >> q;
	vector<int> a(n), b(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i] >> b[i];
	}
	vector<ll> s(n + 1);
	for (int i = 0; i < n; i++) {
		s[i + 1] = s[i] + a[i];
	}
	vector<pair<mint, mint>> t(n + 1);
	vector<pair<mint, mint>> u(n + 1);
	t[n] = {1, 0};
	u[n] = {1, 0};
	for (int i = n - 1; i >= 0; i--) {
		auto [q, r] = t[i + 1];
		auto [s, k] = u[i + 1];
		if (b[i] == 1) {
			t[i] = {q, q * a[i] + r};
			u[i] = {s, k - a[i]};
		}
		else {
			mint inv = mint(b[i]).inv();
			t[i] = {q * b[i], r};
			u[i] = {s * inv, k * inv};
		}
	}
	
	auto f = [&](mint x, pair<mint, mint> p) {
		auto [a, b] = p;
		return a * x + b;
	};

	vector<int> v;
	for (int i = 0; i < n; i++) {
		if (b[i] > 1) v.push_back(i);
	}
	for (int i = 0; i < q; i++) {
		ll x; int l, r;
		cin >> x >> l >> r;
		int p = lower_bound(v.begin(), v.end(), l) - v.begin();
		mint ans;
		bool flag = false;
		for (; p != v.size() && v[p] < r; ++p) {
			x += s[v[p]] - s[l];
			if (x >= mod) {
				ans = f(x % mod, t[v[p]]);
				ans = f(ans, u[r]);
				flag = true;
				break;
			}
			x = max(x * b[v[p]], x + a[v[p]]);
			if (x >= mod) {
				ans = f(x % mod, t[v[p] + 1]);
				ans = f(ans, u[r]);
				flag = true;
				break;
			}
			l = v[p] + 1;
		}
		if (!flag) {
			if (l < r) x += s[r] - s[l];
			ans = x % mod;
		}
		cout << ans << '\n';
	}
}