#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const int MAX_N = 500'005;
int n, q;
long long A[500'005], B[500'005];
long long cum_add[500'005];
pair<long long, long long> cum_lin[500'005];
vector<long long> big_B;
long long x;
int l, r;
long long power(long long a, long long p);
int binsearch_big_B(int l);
int main() {
iostream::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> q;
cum_lin[0] = {1, 0};
for (int i = 1; i <= n; ++i) {
cin >> A[i] >> B[i];
cum_add[i] = cum_add[i - 1] + A[i];
if (B[i] >= 2) {
cum_lin[i].first = (cum_lin[i - 1].first * B[i]) % MOD;
cum_lin[i].second = (cum_lin[i - 1].second * B[i]) % MOD;
big_B.push_back(i);
}
else {
cum_lin[i].first = cum_lin[i - 1].first;
cum_lin[i].second = (cum_lin[i - 1].second + A[i]) % MOD;
}
}
for (int i = 0; i < q; ++i) {
cin >> x >> l >> r; ++l;
auto next_big_B_idx = binsearch_big_B(l);
while (l <= r) {
if (x >= MOD) {
break;
}
if (next_big_B_idx > r) {
x = x + cum_add[r] - cum_add[l - 1];
l = r + 1;
break;
}
else {
x = x + cum_add[next_big_B_idx - 1] - cum_add[l - 1];
}
x = max(x + A[next_big_B_idx], x * B[next_big_B_idx]);
l = next_big_B_idx + 1;
++next_big_B_idx;
}
x %= MOD;
if (l <= r) {
long long C_lr = cum_lin[r].first * power(cum_lin[l - 1].first, MOD - 2) % MOD;
long long D_lr = (cum_lin[r].second - C_lr * cum_lin[l - 1].second % MOD + MOD) % MOD;
x = (C_lr * x + D_lr) % MOD;
}
cout << x << "\n";
}
return 0;
}
long long power(long long a, long long p) {
long long res = 1;
a %= MOD;
while (p > 0) {
if (p % 2 == 1) {
res = (res * a) % MOD;
}
a = (a * a) % MOD;
p /= 2;
}
return res;
}
int binsearch_big_B(int l) {
int left = l, right = big_B.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (big_B[mid] <= l) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return left;
}
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 100 101 102 103 | #include <bits/stdc++.h> using namespace std; const long long MOD = 1e9 + 7; const int MAX_N = 500'005; int n, q; long long A[500'005], B[500'005]; long long cum_add[500'005]; pair<long long, long long> cum_lin[500'005]; vector<long long> big_B; long long x; int l, r; long long power(long long a, long long p); int binsearch_big_B(int l); int main() { iostream::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> q; cum_lin[0] = {1, 0}; for (int i = 1; i <= n; ++i) { cin >> A[i] >> B[i]; cum_add[i] = cum_add[i - 1] + A[i]; if (B[i] >= 2) { cum_lin[i].first = (cum_lin[i - 1].first * B[i]) % MOD; cum_lin[i].second = (cum_lin[i - 1].second * B[i]) % MOD; big_B.push_back(i); } else { cum_lin[i].first = cum_lin[i - 1].first; cum_lin[i].second = (cum_lin[i - 1].second + A[i]) % MOD; } } for (int i = 0; i < q; ++i) { cin >> x >> l >> r; ++l; auto next_big_B_idx = binsearch_big_B(l); while (l <= r) { if (x >= MOD) { break; } if (next_big_B_idx > r) { x = x + cum_add[r] - cum_add[l - 1]; l = r + 1; break; } else { x = x + cum_add[next_big_B_idx - 1] - cum_add[l - 1]; } x = max(x + A[next_big_B_idx], x * B[next_big_B_idx]); l = next_big_B_idx + 1; ++next_big_B_idx; } x %= MOD; if (l <= r) { long long C_lr = cum_lin[r].first * power(cum_lin[l - 1].first, MOD - 2) % MOD; long long D_lr = (cum_lin[r].second - C_lr * cum_lin[l - 1].second % MOD + MOD) % MOD; x = (C_lr * x + D_lr) % MOD; } cout << x << "\n"; } return 0; } long long power(long long a, long long p) { long long res = 1; a %= MOD; while (p > 0) { if (p % 2 == 1) { res = (res * a) % MOD; } a = (a * a) % MOD; p /= 2; } return res; } int binsearch_big_B(int l) { int left = l, right = big_B.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (big_B[mid] <= l) { left = mid + 1; } else { right = mid - 1; } } return left; } |
English