#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const long long M = 1000000007;
long long power(long long base, long long exp) {
long long res = 1;
base %= M;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % M;
base = (base * base) % M;
exp /= 2;
}
return res;
}
long long modInverse(long long n) {
return power(n, M - 2);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
if (!(cin >> n >> q)) return 0;
vector<long long> a(n + 2, 0), b(n + 2, 1);
vector<long long> pref_a(n + 2, 0);
vector<long long> C(n + 2, 1), D(n + 2, 0), invC(n + 2, 1);
vector<int> nxt_a(n + 2, n + 1), nxt_b(n + 2, n + 1);
C[0] = 1;
D[0] = 0;
invC[0] = 1;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
pref_a[i] = pref_a[i - 1] + a[i];
if (b[i] > 1) {
C[i] = (C[i - 1] * b[i]) % M;
D[i] = (D[i - 1] * b[i]) % M;
} else {
C[i] = C[i - 1];
D[i] = (D[i - 1] + a[i]) % M;
}
invC[i] = modInverse(C[i]);
}
for (int i = n; i >= 1; i--) {
nxt_a[i] = (a[i] > 0) ? i : nxt_a[i + 1];
nxt_b[i] = (b[i] > 1) ? i : nxt_b[i + 1];
}
for (int i = 0; i < q; i++){
long long x;
int l, r;
cin >> x >> l >> r;
long long v = x;
int curr = l + 1;
while (curr <= r) {
if (v >= M) {
long long x_val = (v % M - D[curr - 1] + M) % M;
x_val = (x_val * invC[curr - 1]) % M;
v = (C[r] * x_val % M + D[r]) % M;
curr = r + 1;
break;
}
if (v == 0) {
int na = nxt_a[curr];
if (na > r) {
curr = r + 1;
break;
}
if (na > curr) {
curr = na;
continue;
}
v = max(v + a[curr], v * b[curr]);
curr++;
continue;
}
int nb = nxt_b[curr];
if (nb > curr) {
int nb_limit = min(nb - 1, r);
v += pref_a[nb_limit] - pref_a[curr - 1];
curr = nb_limit + 1;
continue;
}
v = max(v + a[curr], v * b[curr]);
curr++;
}
cout << (v % M) << "\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 <iostream> #include <vector> #include <algorithm> using namespace std; const long long M = 1000000007; long long power(long long base, long long exp) { long long res = 1; base %= M; while (exp > 0) { if (exp % 2 == 1) res = (res * base) % M; base = (base * base) % M; exp /= 2; } return res; } long long modInverse(long long n) { return power(n, M - 2); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, q; if (!(cin >> n >> q)) return 0; vector<long long> a(n + 2, 0), b(n + 2, 1); vector<long long> pref_a(n + 2, 0); vector<long long> C(n + 2, 1), D(n + 2, 0), invC(n + 2, 1); vector<int> nxt_a(n + 2, n + 1), nxt_b(n + 2, n + 1); C[0] = 1; D[0] = 0; invC[0] = 1; for (int i = 1; i <= n; i++) { cin >> a[i] >> b[i]; pref_a[i] = pref_a[i - 1] + a[i]; if (b[i] > 1) { C[i] = (C[i - 1] * b[i]) % M; D[i] = (D[i - 1] * b[i]) % M; } else { C[i] = C[i - 1]; D[i] = (D[i - 1] + a[i]) % M; } invC[i] = modInverse(C[i]); } for (int i = n; i >= 1; i--) { nxt_a[i] = (a[i] > 0) ? i : nxt_a[i + 1]; nxt_b[i] = (b[i] > 1) ? i : nxt_b[i + 1]; } for (int i = 0; i < q; i++){ long long x; int l, r; cin >> x >> l >> r; long long v = x; int curr = l + 1; while (curr <= r) { if (v >= M) { long long x_val = (v % M - D[curr - 1] + M) % M; x_val = (x_val * invC[curr - 1]) % M; v = (C[r] * x_val % M + D[r]) % M; curr = r + 1; break; } if (v == 0) { int na = nxt_a[curr]; if (na > r) { curr = r + 1; break; } if (na > curr) { curr = na; continue; } v = max(v + a[curr], v * b[curr]); curr++; continue; } int nb = nxt_b[curr]; if (nb > curr) { int nb_limit = min(nb - 1, r); v += pref_a[nb_limit] - pref_a[curr - 1]; curr = nb_limit + 1; continue; } v = max(v + a[curr], v * b[curr]); curr++; } cout << (v % M) << "\n"; } return 0; } |
English