#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 5e5 + 5;
const long long MOD = 1e9 + 7;
long long sum(initializer_list<long long> nums) {
long long s = 0;
for (long long x : nums) s = ((s + (x % MOD)) % MOD + MOD) % MOD;
return s;
}
long long mul(initializer_list<long long> nums) {
long long s = 1;
for (long long x : nums) s = ((s * (x % MOD)) % MOD + MOD) % MOD;
return s;
}
struct LinearFunction {
long long slope;
long long intercept;
LinearFunction() : slope(1), intercept(0) {}
LinearFunction(long long slope_, long long intercept_)
: slope(slope_), intercept(intercept_) {}
LinearFunction compose(long long gSlope, long long gIntercept) const {
return LinearFunction(
mul({slope, gSlope}),
sum({mul({intercept, gSlope}), gIntercept})
);
}
};
long long events[MAX_N][2];
vector<LinearFunction> functions;
int jump[MAX_N];
long long pref_sum[MAX_N];
long long pow(long long base, long long exp) {
if (exp == 0) {
return 1;
}
long long h = pow(base, exp >> 1);
if (exp & 1) {
return mul({h, h, base});
}
return mul({h * h});
}
long long invert(long long num) {
return pow(num, MOD - 2);
}
long long dfs(long long x, int lo, int hi) {
if (lo == hi) {
return x % MOD;
}
if (x >= MOD) {
long long slope = mul({functions[hi].slope, invert(functions[lo].slope)});
return sum({
mul({slope, x}),
functions[hi].intercept,
mul({slope, -functions[lo].intercept})
});
}
if (events[lo][1] == 1) {
int jump_to = min(hi, jump[lo]);
return dfs(x + pref_sum[jump_to] - pref_sum[lo], jump_to, hi);
}
if (events[lo][1] == 1 || x + events[lo][0] > x * events[lo][1]) {
return dfs(x + events[lo][0], lo + 1, hi);
}
return dfs(x * events[lo][1], lo + 1, hi);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
for (int i = 0; i < n; i++) {
cin >> events[i][0] >> events[i][1];
}
functions.push_back(LinearFunction(1, 0));
for (int i = 1; i <= n; i++) {
functions.push_back(functions[i - 1].compose(events[i - 1][1], events[i - 1][1] > 1 ? 0 : events[i - 1][0]));
pref_sum[i] = pref_sum[i - 1] + events[i - 1][0];
}
for (int i = 0; i < n; ) {
if (events[i][1] > 1) {
i++;
continue;
}
int j = i;
while (j < n && events[j][1] == 1) {
j++;
}
while (i < j) {
jump[i++] = j;
}
}
for (int i = 0; i < q; i++) {
long long x;
int lo, hi;
cin >> x >> lo >> hi;
cout << dfs(x, lo, hi) << endl;
}
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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <bits/stdc++.h> using namespace std; const int MAX_N = 5e5 + 5; const long long MOD = 1e9 + 7; long long sum(initializer_list<long long> nums) { long long s = 0; for (long long x : nums) s = ((s + (x % MOD)) % MOD + MOD) % MOD; return s; } long long mul(initializer_list<long long> nums) { long long s = 1; for (long long x : nums) s = ((s * (x % MOD)) % MOD + MOD) % MOD; return s; } struct LinearFunction { long long slope; long long intercept; LinearFunction() : slope(1), intercept(0) {} LinearFunction(long long slope_, long long intercept_) : slope(slope_), intercept(intercept_) {} LinearFunction compose(long long gSlope, long long gIntercept) const { return LinearFunction( mul({slope, gSlope}), sum({mul({intercept, gSlope}), gIntercept}) ); } }; long long events[MAX_N][2]; vector<LinearFunction> functions; int jump[MAX_N]; long long pref_sum[MAX_N]; long long pow(long long base, long long exp) { if (exp == 0) { return 1; } long long h = pow(base, exp >> 1); if (exp & 1) { return mul({h, h, base}); } return mul({h * h}); } long long invert(long long num) { return pow(num, MOD - 2); } long long dfs(long long x, int lo, int hi) { if (lo == hi) { return x % MOD; } if (x >= MOD) { long long slope = mul({functions[hi].slope, invert(functions[lo].slope)}); return sum({ mul({slope, x}), functions[hi].intercept, mul({slope, -functions[lo].intercept}) }); } if (events[lo][1] == 1) { int jump_to = min(hi, jump[lo]); return dfs(x + pref_sum[jump_to] - pref_sum[lo], jump_to, hi); } if (events[lo][1] == 1 || x + events[lo][0] > x * events[lo][1]) { return dfs(x + events[lo][0], lo + 1, hi); } return dfs(x * events[lo][1], lo + 1, hi); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; for (int i = 0; i < n; i++) { cin >> events[i][0] >> events[i][1]; } functions.push_back(LinearFunction(1, 0)); for (int i = 1; i <= n; i++) { functions.push_back(functions[i - 1].compose(events[i - 1][1], events[i - 1][1] > 1 ? 0 : events[i - 1][0])); pref_sum[i] = pref_sum[i - 1] + events[i - 1][0]; } for (int i = 0; i < n; ) { if (events[i][1] > 1) { i++; continue; } int j = i; while (j < n && events[j][1] == 1) { j++; } while (i < j) { jump[i++] = j; } } for (int i = 0; i < q; i++) { long long x; int lo, hi; cin >> x >> lo >> hi; cout << dfs(x, lo, hi) << endl; } return 0; } |
English