#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli MOD = 1000000007;
const int MAXN = 500005;
lli t[MAXN][2];
lli nextp[MAXN];
lli prs[MAXN];
lli trans[MAXN][2];
lli pow(lli a, lli n) {
if (n == 0)
return 1LL;
if (n%2 == 0) {
lli p = pow(a, n/2);
return (p*p)%MOD;
}
else {
return (a*pow(a, n-1))%MOD;
}
}
lli inv(lli a) {
return pow(a, MOD-2);
}
lli sumi(lli l, lli r) {
return prs[r-1] - prs[l-1];
}
// pair<lli, lli> walk(lli l, lli r) {
// //TODO
// return {0, 0};
// }
lli safe_mod(lli a) {
a = a%MOD;
if (a < 0)
a += MOD;
return a;
}
lli finalize(lli x, lli l, lli r) {
lli y = (safe_mod(x - trans[l][0]) * inv(trans[l][1])) % MOD;
return (y * trans[r][1] + trans[r][0]) % MOD;
}
int main() {
int n, q;
scanf("%d%d", &n, &q);
for (int i=1; i<=n; i++) {
scanf("%lld%lld", &t[i][0], &t[i][1]);
prs[i] = (prs[i-1] + t[i][0]);
}
nextp[n+1] = n+1;
nextp[n] = n+1;
trans[0][0] = 0;
trans[0][1] = 1;
for (int i=1; i<=n; i++) {
if (t[i][1] == 1) {
trans[i][0] = (trans[i-1][0] + t[i][0]) % MOD;
trans[i][1] = trans[i-1][1];
}
else {
trans[i][0] = (trans[i-1][0] * t[i][1]) % MOD;
trans[i][1] = (trans[i-1][1] * t[i][1]) % MOD;
}
}
for (int i=n-1; i>=0; i--) {
if (t[i+1][1] == 1) {
nextp[i] = nextp[i+1];
}
else {
nextp[i] = i+1;
}
}
for (int i=0; i<q; i++) {
lli x, l, r;
scanf("%lld%lld%lld", &x, &l, &r);
while (true) {
if (l >= r)
break;
int p = nextp[l];
if (p > r) {
x = (x + sumi(l+1, r+1))%MOD;
break;
}
x += sumi(l+1, p);
if (x >= MOD) {
x = finalize(x%MOD, p-1, r);
break;
}
x = max(x + t[p][0], x*t[p][1]);
if (x >= MOD) {
x = finalize(x%MOD, p, r);
break;
}
l = p;
}
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 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 115 116 117 118 119 120 121 122 123 124 | #include <bits/stdc++.h> using namespace std; typedef long long int lli; const lli MOD = 1000000007; const int MAXN = 500005; lli t[MAXN][2]; lli nextp[MAXN]; lli prs[MAXN]; lli trans[MAXN][2]; lli pow(lli a, lli n) { if (n == 0) return 1LL; if (n%2 == 0) { lli p = pow(a, n/2); return (p*p)%MOD; } else { return (a*pow(a, n-1))%MOD; } } lli inv(lli a) { return pow(a, MOD-2); } lli sumi(lli l, lli r) { return prs[r-1] - prs[l-1]; } // pair<lli, lli> walk(lli l, lli r) { // //TODO // return {0, 0}; // } lli safe_mod(lli a) { a = a%MOD; if (a < 0) a += MOD; return a; } lli finalize(lli x, lli l, lli r) { lli y = (safe_mod(x - trans[l][0]) * inv(trans[l][1])) % MOD; return (y * trans[r][1] + trans[r][0]) % MOD; } int main() { int n, q; scanf("%d%d", &n, &q); for (int i=1; i<=n; i++) { scanf("%lld%lld", &t[i][0], &t[i][1]); prs[i] = (prs[i-1] + t[i][0]); } nextp[n+1] = n+1; nextp[n] = n+1; trans[0][0] = 0; trans[0][1] = 1; for (int i=1; i<=n; i++) { if (t[i][1] == 1) { trans[i][0] = (trans[i-1][0] + t[i][0]) % MOD; trans[i][1] = trans[i-1][1]; } else { trans[i][0] = (trans[i-1][0] * t[i][1]) % MOD; trans[i][1] = (trans[i-1][1] * t[i][1]) % MOD; } } for (int i=n-1; i>=0; i--) { if (t[i+1][1] == 1) { nextp[i] = nextp[i+1]; } else { nextp[i] = i+1; } } for (int i=0; i<q; i++) { lli x, l, r; scanf("%lld%lld%lld", &x, &l, &r); while (true) { if (l >= r) break; int p = nextp[l]; if (p > r) { x = (x + sumi(l+1, r+1))%MOD; break; } x += sumi(l+1, p); if (x >= MOD) { x = finalize(x%MOD, p-1, r); break; } x = max(x + t[p][0], x*t[p][1]); if (x >= MOD) { x = finalize(x%MOD, p, r); break; } l = p; } printf("%lld\n", x); } return 0; } |
English