#include <bits/stdc++.h>
using namespace std;
constexpr int mod = 1e9 + 7;
constexpr int N = 1e6 + 50;
inline int inc(int x, int y) { x += y - mod; return x + (x >> 31 & mod); }
inline int dec(int x, int y) { x -= y; return x + (x >> 31 & mod); }
inline int mul(int x, int y) { return 1ll * x * y % mod; }
inline int fastpow(int x, int p) {
int res = 1;
while (p) {
if (p & 1) res = mul(res, x);
x = mul(x, x);
p >>= 1;
}
return res;
}
int a[N], b[N];
int nxt_b[N], nxt_a[N];
int pref_P[N], inv_P[N], pref_Q[N];
int pref_a[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
cin >> a[i] >> b[i];
}
nxt_b[n + 1] = n + 1;
nxt_a[n + 1] = n + 1;
for (int i = n; i >= 1; --i) {
nxt_b[i] = (b[i] >= 2) ? i : nxt_b[i + 1];
nxt_a[i] = (a[i] > 0) ? i : nxt_a[i + 1];
}
pref_P[0] = 1;
inv_P[0] = 1;
for (int i = 1; i <= n; ++i) {
int Pi = (b[i] >= 2) ? b[i] : 1;
int Qi = (b[i] >= 2) ? 0 : a[i];
pref_P[i] = mul(pref_P[i - 1], Pi);
inv_P[i] = fastpow(pref_P[i], mod - 2);
pref_Q[i] = inc(mul(pref_Q[i - 1], Pi), Qi);
pref_a[i] = pref_a[i - 1] + ((b[i] == 1) ? a[i] : 0);
}
while (q--) {
int x, l, r;
cin >> x >> l >> r;
long long C = x;
int idx = l + 1;
while (idx <= r) {
if (C >= mod) {
C %= mod;
int P_range = mul(pref_P[r], inv_P[idx - 1]);
int Q_range = dec(pref_Q[r], mul(pref_Q[idx - 1], P_range));
C = inc(mul(C, P_range), Q_range);
break;
}
if (C == 0) {
int k = nxt_a[idx];
if (k > r) {
C = 0;
break;
}
idx = k;
C = a[idx];
++idx;
continue;
}
int j = nxt_b[idx];
if (j > r) {
C += pref_a[r] - pref_a[idx - 1];
break;
}
C += pref_a[j - 1] - pref_a[idx - 1];
idx = j;
if (C >= mod) continue;
C = max(C + a[j], C * b[j]);
++idx;
}
cout << C % mod << '\n';
}
}
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 | #include <bits/stdc++.h> using namespace std; constexpr int mod = 1e9 + 7; constexpr int N = 1e6 + 50; inline int inc(int x, int y) { x += y - mod; return x + (x >> 31 & mod); } inline int dec(int x, int y) { x -= y; return x + (x >> 31 & mod); } inline int mul(int x, int y) { return 1ll * x * y % mod; } inline int fastpow(int x, int p) { int res = 1; while (p) { if (p & 1) res = mul(res, x); x = mul(x, x); p >>= 1; } return res; } int a[N], b[N]; int nxt_b[N], nxt_a[N]; int pref_P[N], inv_P[N], pref_Q[N]; int pref_a[N]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> a[i] >> b[i]; } nxt_b[n + 1] = n + 1; nxt_a[n + 1] = n + 1; for (int i = n; i >= 1; --i) { nxt_b[i] = (b[i] >= 2) ? i : nxt_b[i + 1]; nxt_a[i] = (a[i] > 0) ? i : nxt_a[i + 1]; } pref_P[0] = 1; inv_P[0] = 1; for (int i = 1; i <= n; ++i) { int Pi = (b[i] >= 2) ? b[i] : 1; int Qi = (b[i] >= 2) ? 0 : a[i]; pref_P[i] = mul(pref_P[i - 1], Pi); inv_P[i] = fastpow(pref_P[i], mod - 2); pref_Q[i] = inc(mul(pref_Q[i - 1], Pi), Qi); pref_a[i] = pref_a[i - 1] + ((b[i] == 1) ? a[i] : 0); } while (q--) { int x, l, r; cin >> x >> l >> r; long long C = x; int idx = l + 1; while (idx <= r) { if (C >= mod) { C %= mod; int P_range = mul(pref_P[r], inv_P[idx - 1]); int Q_range = dec(pref_Q[r], mul(pref_Q[idx - 1], P_range)); C = inc(mul(C, P_range), Q_range); break; } if (C == 0) { int k = nxt_a[idx]; if (k > r) { C = 0; break; } idx = k; C = a[idx]; ++idx; continue; } int j = nxt_b[idx]; if (j > r) { C += pref_a[r] - pref_a[idx - 1]; break; } C += pref_a[j - 1] - pref_a[idx - 1]; idx = j; if (C >= mod) continue; C = max(C + a[j], C * b[j]); ++idx; } cout << C % mod << '\n'; } } |
English