#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
constexpr long long mod = 1e9 + 7;
long long pw(long long a, long long b) {
long long mult = a;
while (b >= 1) {
if (b & 1) a = (a * mult) % mod;
mult = (mult * mult) % mod;
b /= 2;
}
return a;
}
long long inv(long long a) {
return pw(a, mod - 3);
}
long long dv(long long a, long long b) {
return (a * inv(b)) % mod;
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<pair<long long, long long>> opt(n);
vector<long long> pre(n + 1), prem(n + 1), prem2(n + 1), pres(n + 1);
vector<int> nxt(n);
pre[0] = 1; prem[0] = 1; prem2[n] = 1;
for (int i = 0; i < n; i++) {
long long a, b;
cin >> a >> b;
opt[i] = {a, b};
pre[i + 1] = pre[i] + a;
prem[i + 1] = (prem[i] * b) % mod;
}
for (int i = n - 1; i >= 0; i--) {
prem2[i] = (prem2[i + 1] * opt[i].second) % mod;
}
for (int i = 0; i < n; i++) {
pres[i + 1] = pres[i];
if (opt[i].second == 1) pres[i + 1] += opt[i].first * prem2[i];
pres[i + 1] %= mod;
}
{
int p = n + 1;
for (int i = n - 1; i >= 0; i--) {
nxt[i] = p;
if (opt[i].second > 1) p = i;
}
}
// for (int i = 0; i <= n; i++) {
// cerr << pres[i] << ' ';
// }
// cerr << '\n';
while (q--) {
long long x;
int l, r;
cin >> x >> l >> r;
int cur = l;
while (x < 1e9) {
int t = nxt[cur];
if (t > r) break;
bool b = false;
x = max(x + opt[cur].first, x * opt[cur].second);
if (x >= 1e9) b = true;
x %= mod;
x = (x + (pre[t] - pre[cur + 1])) % mod;
cur = t;
if (b) break;
}
if (r != cur) {
long long mult = dv(prem[r], prem[cur]);
x = (x * mult) % mod;
long long add = dv((pres[r] - pres[cur] + mod) % mod, prem2[r]);
x = (x + add) % mod;
// cerr << prem[r] << ' ' << prem[cur] << ' ' << mult << '\n';
// cerr << x << ' ' << add << ' ' << mult << '\n';
}
cout << x << '\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 92 93 94 95 96 97 98 99 | #include <bits/stdc++.h> #define endl '\n' using namespace std; constexpr long long mod = 1e9 + 7; long long pw(long long a, long long b) { long long mult = a; while (b >= 1) { if (b & 1) a = (a * mult) % mod; mult = (mult * mult) % mod; b /= 2; } return a; } long long inv(long long a) { return pw(a, mod - 3); } long long dv(long long a, long long b) { return (a * inv(b)) % mod; }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; vector<pair<long long, long long>> opt(n); vector<long long> pre(n + 1), prem(n + 1), prem2(n + 1), pres(n + 1); vector<int> nxt(n); pre[0] = 1; prem[0] = 1; prem2[n] = 1; for (int i = 0; i < n; i++) { long long a, b; cin >> a >> b; opt[i] = {a, b}; pre[i + 1] = pre[i] + a; prem[i + 1] = (prem[i] * b) % mod; } for (int i = n - 1; i >= 0; i--) { prem2[i] = (prem2[i + 1] * opt[i].second) % mod; } for (int i = 0; i < n; i++) { pres[i + 1] = pres[i]; if (opt[i].second == 1) pres[i + 1] += opt[i].first * prem2[i]; pres[i + 1] %= mod; } { int p = n + 1; for (int i = n - 1; i >= 0; i--) { nxt[i] = p; if (opt[i].second > 1) p = i; } } // for (int i = 0; i <= n; i++) { // cerr << pres[i] << ' '; // } // cerr << '\n'; while (q--) { long long x; int l, r; cin >> x >> l >> r; int cur = l; while (x < 1e9) { int t = nxt[cur]; if (t > r) break; bool b = false; x = max(x + opt[cur].first, x * opt[cur].second); if (x >= 1e9) b = true; x %= mod; x = (x + (pre[t] - pre[cur + 1])) % mod; cur = t; if (b) break; } if (r != cur) { long long mult = dv(prem[r], prem[cur]); x = (x * mult) % mod; long long add = dv((pres[r] - pres[cur] + mod) % mod, prem2[r]); x = (x + add) % mod; // cerr << prem[r] << ' ' << prem[cur] << ' ' << mult << '\n'; // cerr << x << ' ' << add << ' ' << mult << '\n'; } cout << x << '\n'; } return 0; } |
English