#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
struct mint {
int x;
mint() : x(0) {}
mint(int x) : x(x) {}
mint operator+(const int &ot) const { return x >= mod - ot ? x - mod + ot : x + ot; }
mint operator-(const int &ot) const { return x < ot ? x - ot + mod : x - ot; }
mint operator*(const int &ot) const { return 1ll * x * ot % mod; }
mint operator+=(int ot) { return *this = *this + ot; }
mint operator-=(int ot) { return *this = *this - ot; }
mint operator*=(int ot) { return *this = *this * ot; }
mint pow(ll k) {
mint a = x, r = 1;
for (; k; k >>= 1) {
if (k & 1) r *= a;
a *= a;
}
return r;
}
mint inv() {
return pow(mod - 2);
}
operator int() { return x; }
};
int main() {
cin.tie(0); ios_base::sync_with_stdio(0);
int n, q;
cin >> n >> q;
vector<int> a(n), b(n);
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
}
vector<ll> s(n + 1);
for (int i = 0; i < n; i++) {
s[i + 1] = s[i] + a[i];
}
vector<pair<mint, mint>> t(n + 1);
vector<pair<mint, mint>> u(n + 1);
t[n] = {1, 0};
u[n] = {1, 0};
for (int i = n - 1; i >= 0; i--) {
auto [q, r] = t[i + 1];
auto [s, k] = u[i + 1];
if (b[i] == 1) {
t[i] = {q, q * a[i] + r};
u[i] = {s, k - a[i]};
}
else {
mint inv = mint(b[i]).inv();
t[i] = {q * b[i], r};
u[i] = {s * inv, k * inv};
}
}
auto f = [&](mint x, pair<mint, mint> p) {
auto [a, b] = p;
return a * x + b;
};
vector<int> v;
for (int i = 0; i < n; i++) {
if (b[i] > 1) v.push_back(i);
}
for (int i = 0; i < q; i++) {
ll x; int l, r;
cin >> x >> l >> r;
int p = lower_bound(v.begin(), v.end(), l) - v.begin();
mint ans;
bool flag = false;
for (; p != v.size() && v[p] < r; ++p) {
x += s[v[p]] - s[l];
if (x >= mod) {
ans = f(x % mod, t[v[p]]);
ans = f(ans, u[r]);
flag = true;
break;
}
x = max(x * b[v[p]], x + a[v[p]]);
if (x >= mod) {
ans = f(x % mod, t[v[p] + 1]);
ans = f(ans, u[r]);
flag = true;
break;
}
l = v[p] + 1;
}
if (!flag) {
if (l < r) x += s[r] - s[l];
ans = x % mod;
}
cout << ans << '\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 88 89 90 91 92 93 94 95 96 97 98 | #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod = 1e9 + 7; struct mint { int x; mint() : x(0) {} mint(int x) : x(x) {} mint operator+(const int &ot) const { return x >= mod - ot ? x - mod + ot : x + ot; } mint operator-(const int &ot) const { return x < ot ? x - ot + mod : x - ot; } mint operator*(const int &ot) const { return 1ll * x * ot % mod; } mint operator+=(int ot) { return *this = *this + ot; } mint operator-=(int ot) { return *this = *this - ot; } mint operator*=(int ot) { return *this = *this * ot; } mint pow(ll k) { mint a = x, r = 1; for (; k; k >>= 1) { if (k & 1) r *= a; a *= a; } return r; } mint inv() { return pow(mod - 2); } operator int() { return x; } }; int main() { cin.tie(0); ios_base::sync_with_stdio(0); int n, q; cin >> n >> q; vector<int> a(n), b(n); for (int i = 0; i < n; i++) { cin >> a[i] >> b[i]; } vector<ll> s(n + 1); for (int i = 0; i < n; i++) { s[i + 1] = s[i] + a[i]; } vector<pair<mint, mint>> t(n + 1); vector<pair<mint, mint>> u(n + 1); t[n] = {1, 0}; u[n] = {1, 0}; for (int i = n - 1; i >= 0; i--) { auto [q, r] = t[i + 1]; auto [s, k] = u[i + 1]; if (b[i] == 1) { t[i] = {q, q * a[i] + r}; u[i] = {s, k - a[i]}; } else { mint inv = mint(b[i]).inv(); t[i] = {q * b[i], r}; u[i] = {s * inv, k * inv}; } } auto f = [&](mint x, pair<mint, mint> p) { auto [a, b] = p; return a * x + b; }; vector<int> v; for (int i = 0; i < n; i++) { if (b[i] > 1) v.push_back(i); } for (int i = 0; i < q; i++) { ll x; int l, r; cin >> x >> l >> r; int p = lower_bound(v.begin(), v.end(), l) - v.begin(); mint ans; bool flag = false; for (; p != v.size() && v[p] < r; ++p) { x += s[v[p]] - s[l]; if (x >= mod) { ans = f(x % mod, t[v[p]]); ans = f(ans, u[r]); flag = true; break; } x = max(x * b[v[p]], x + a[v[p]]); if (x >= mod) { ans = f(x % mod, t[v[p] + 1]); ans = f(ans, u[r]); flag = true; break; } l = v[p] + 1; } if (!flag) { if (l < r) x += s[r] - s[l]; ans = x % mod; } cout << ans << '\n'; } } |
English