#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll M = 1000000007;
int n, q, a[500005], b[500005], nx[500005], na[500005];
ll sa[500005], P[500005], S[500005], I[500005];
ll pw(ll A, ll B) {
ll R = 1;
for (; B; B >>= 1, A = A * A % M) {
if (B & 1) R = R * A % M;
}
return R;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
cin >> a[i] >> b[i];
}
int nb = n + 1, nA = n + 1;
for (int i = n; i >= 1; --i) {
if (b[i] >= 2) nb = i;
nx[i] = nb;
if (a[i] > 0) nA = i;
na[i] = nA;
}
P[0] = 1;
for (int i = 1; i <= n; ++i) {
sa[i] = sa[i - 1] + (b[i] == 1 ? a[i] : 0);
if (b[i] >= 2) {
P[i] = P[i - 1] * b[i] % M;
S[i] = S[i - 1] * b[i] % M;
} else {
P[i] = P[i - 1];
S[i] = (S[i - 1] + a[i]) % M;
}
}
I[n] = pw(P[n], M - 2);
for (int i = n - 1; i >= 0; --i) {
I[i] = I[i + 1] * (b[i + 1] >= 2 ? b[i + 1] : 1) % M;
}
while (q--) {
ll x;
int l, r;
cin >> x >> l >> r;
ll v = x;
int i = l + 1;
while (i <= r && v <= 1000000006) {
if (!v) {
i = na[i];
if (i > r) break;
}
int j = nx[i];
if (j > r) {
v += sa[r] - sa[i - 1];
i = r + 1;
break;
}
v += sa[j - 1] - sa[i - 1];
if (v > 1000000006) {
i = j;
break;
}
v = max(v + a[j], v * b[j]);
i = j + 1;
}
if (i <= r) {
v %= M;
ll X = (v - S[i - 1]) % M;
if (X < 0) X += M;
v = (P[r] * (X * I[i - 1] % M) + S[r]) % M;
} else {
v %= M;
}
cout << v << '\n';
}
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; using ll = long long; const ll M = 1000000007; int n, q, a[500005], b[500005], nx[500005], na[500005]; ll sa[500005], P[500005], S[500005], I[500005]; ll pw(ll A, ll B) { ll R = 1; for (; B; B >>= 1, A = A * A % M) { if (B & 1) R = R * A % M; } return R; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> a[i] >> b[i]; } int nb = n + 1, nA = n + 1; for (int i = n; i >= 1; --i) { if (b[i] >= 2) nb = i; nx[i] = nb; if (a[i] > 0) nA = i; na[i] = nA; } P[0] = 1; for (int i = 1; i <= n; ++i) { sa[i] = sa[i - 1] + (b[i] == 1 ? a[i] : 0); if (b[i] >= 2) { P[i] = P[i - 1] * b[i] % M; S[i] = S[i - 1] * b[i] % M; } else { P[i] = P[i - 1]; S[i] = (S[i - 1] + a[i]) % M; } } I[n] = pw(P[n], M - 2); for (int i = n - 1; i >= 0; --i) { I[i] = I[i + 1] * (b[i + 1] >= 2 ? b[i + 1] : 1) % M; } while (q--) { ll x; int l, r; cin >> x >> l >> r; ll v = x; int i = l + 1; while (i <= r && v <= 1000000006) { if (!v) { i = na[i]; if (i > r) break; } int j = nx[i]; if (j > r) { v += sa[r] - sa[i - 1]; i = r + 1; break; } v += sa[j - 1] - sa[i - 1]; if (v > 1000000006) { i = j; break; } v = max(v + a[j], v * b[j]); i = j + 1; } if (i <= r) { v %= M; ll X = (v - S[i - 1]) % M; if (X < 0) X += M; v = (P[r] * (X * I[i - 1] % M) + S[r]) % M; } else { v %= M; } cout << v << '\n'; } return 0; } |
English