#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 1000000007;
ll power(ll a, int b) {
if(b == 0) return 1ll;
if(b&1) return (a * power(a, b - 1)) % mod;
ll ret = power(a, b / 2);
return (ret * ret) % mod;
}
ll inv(ll x) {
return power(x, int(mod) - 2);
}
vector <ll> sum_a, mul_b, sum_hlp; // suma (a / iloczyn b po lewej)
ll Sum_a(int l, int r) {
if(l > r) return 0ll;
return sum_a[r] - sum_a[l - 1];
}
ll Mul_b(int l, int r) {
return (mul_b[r] * inv(mul_b[l - 1])) % mod;
}
ll Sum_hlp(int l, int r) {
ll s = sum_hlp[r] - sum_hlp[l - 1];
return (s < 0) ? s + mod : s;
}
int main() {
int n, q; scanf("%d%d", &n, &q);
vector <ll> a(n + 1, 0ll), b(n + 1, 1ll);
sum_a.resize(n + 1, 0ll); mul_b.resize(n + 1, 1ll); sum_hlp.resize(n + 1, 0ll);
for(int i = 1; i <= n; ++i) {
scanf("%lld%lld", &a[i], &b[i]);
sum_a[i] = sum_a[i - 1] + a[i];
mul_b[i] = (mul_b[i - 1] * b[i]) % mod;
sum_hlp[i] = sum_hlp[i - 1];
if(b[i] == 1ll)
sum_hlp[i] = (sum_hlp[i] + a[i] * inv(mul_b[i])) % mod;
}
vector <int> nxt(n + 1, 0); // pozycja nastepnego b wiekszego od 1, n + 1 jesli nie ma
for(int i = n, p = n + 1; i >= 0; --i) {
nxt[i] = p;
if(b[i] > 1ll) p = i;
}
for(++q; --q;) {
ll x; int l, r;
scanf("%lld%d%d", &x, &l, &r);
while(l < r) { // i break jesli x >= mod
int i = nxt[l];
//printf("%d %d %d\n", l, r, i);
if(i > r) {
x = (x + Sum_a(l + 1, r)) % mod;
l = r;
break;
}
x = x + Sum_a(l + 1, i - 1);
l = i;
if(x >= mod) {
x = ((x % mod) * b[i]) % mod;
break;
}
x = max(x * b[i], x + a[i]);
if(x >= mod) {
x %= mod;
break;
}
}
if(l < r)
x = (x * Mul_b(l + 1, r) + Sum_hlp(l + 1, r) * Mul_b(1, r)) % mod;
printf("%lld\n", x);
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; ll mod = 1000000007; ll power(ll a, int b) { if(b == 0) return 1ll; if(b&1) return (a * power(a, b - 1)) % mod; ll ret = power(a, b / 2); return (ret * ret) % mod; } ll inv(ll x) { return power(x, int(mod) - 2); } vector <ll> sum_a, mul_b, sum_hlp; // suma (a / iloczyn b po lewej) ll Sum_a(int l, int r) { if(l > r) return 0ll; return sum_a[r] - sum_a[l - 1]; } ll Mul_b(int l, int r) { return (mul_b[r] * inv(mul_b[l - 1])) % mod; } ll Sum_hlp(int l, int r) { ll s = sum_hlp[r] - sum_hlp[l - 1]; return (s < 0) ? s + mod : s; } int main() { int n, q; scanf("%d%d", &n, &q); vector <ll> a(n + 1, 0ll), b(n + 1, 1ll); sum_a.resize(n + 1, 0ll); mul_b.resize(n + 1, 1ll); sum_hlp.resize(n + 1, 0ll); for(int i = 1; i <= n; ++i) { scanf("%lld%lld", &a[i], &b[i]); sum_a[i] = sum_a[i - 1] + a[i]; mul_b[i] = (mul_b[i - 1] * b[i]) % mod; sum_hlp[i] = sum_hlp[i - 1]; if(b[i] == 1ll) sum_hlp[i] = (sum_hlp[i] + a[i] * inv(mul_b[i])) % mod; } vector <int> nxt(n + 1, 0); // pozycja nastepnego b wiekszego od 1, n + 1 jesli nie ma for(int i = n, p = n + 1; i >= 0; --i) { nxt[i] = p; if(b[i] > 1ll) p = i; } for(++q; --q;) { ll x; int l, r; scanf("%lld%d%d", &x, &l, &r); while(l < r) { // i break jesli x >= mod int i = nxt[l]; //printf("%d %d %d\n", l, r, i); if(i > r) { x = (x + Sum_a(l + 1, r)) % mod; l = r; break; } x = x + Sum_a(l + 1, i - 1); l = i; if(x >= mod) { x = ((x % mod) * b[i]) % mod; break; } x = max(x * b[i], x + a[i]); if(x >= mod) { x %= mod; break; } } if(l < r) x = (x * Mul_b(l + 1, r) + Sum_hlp(l + 1, r) * Mul_b(1, r)) % mod; printf("%lld\n", x); } return 0; } |
English