#include <bits/stdc++.h>
using namespace std;
constexpr int mod = 1000000007;
long long a[500007];
long long b[500007];
int nextA[500007];
int nextB[500007];
long long sufA[500007];
long long sufB[500007];
long long sufAdditional[500007];
long long modPow(long long a, long long b)
{
if (b == 0) return 1;
long long v = modPow(a, b / 2);
v = (v * v) % mod;
if (b & 1) return (v * a) % mod;
else return v;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, q;
cin >> n >> q;
for (int i = 0; i < n; ++i) cin >> a[i] >> b[i];
sufB[n] = 1;
sufB[n + 1] = 1;
sufB[n + 2] = 1;
sufB[n + 3] = 1;
for (int i = n - 1; i >= 0; --i)
{
sufA[i] = sufA[i + 1] + a[i];
sufB[i] = (sufB[i + 1] * b[i]) % mod;
}
nextA[n] = n;
nextA[n + 1] = n;
nextA[n + 2] = n;
nextB[n] = n;
nextB[n + 1] = n;
nextB[n + 2] = n;
for (int i = n - 1; i >= 0; --i)
{
nextA[i] = nextA[i + 1];
nextB[i] = nextB[i + 1];
sufAdditional[i] = sufAdditional[i + 1];
if (a[i] > 0) nextA[i] = i;
if (b[i] > 1) nextB[i] = i;
if (b[i] == 1)
{
sufAdditional[i] = (sufAdditional[i] + a[i] * sufB[i]) % mod;
}
}
for (int i = 0; i < q; ++i)
{
long long x;
int l, r;
cin >> x >> l >> r;
--r;
if (x == 0)
{
if (nextA[l] > r)
{
cout << "0\n";
continue;
}
l = nextA[l];
}
while (l <= r)
{
x = max(x + a[l], x * b[l]);
x += sufA[l + 1] - sufA[min(r, nextB[l + 1] - 1) + 1];
l = nextB[l + 1];
if (x >= mod)
{
x %= mod;
break;
}
}
if (l > r)
{
cout << x << '\n';
continue;
}
x = (x * sufB[l]) % mod;
x = (x * modPow(sufB[r + 1], mod - 2)) % mod;
long long additional = (sufAdditional[l] - sufAdditional[r + 1]) % mod;
additional = (additional + mod) % mod;
additional = (additional * modPow(sufB[r + 1], mod - 2));
x = (x + additional) % mod;
cout << x << '\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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <bits/stdc++.h> using namespace std; constexpr int mod = 1000000007; long long a[500007]; long long b[500007]; int nextA[500007]; int nextB[500007]; long long sufA[500007]; long long sufB[500007]; long long sufAdditional[500007]; long long modPow(long long a, long long b) { if (b == 0) return 1; long long v = modPow(a, b / 2); v = (v * v) % mod; if (b & 1) return (v * a) % mod; else return v; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; for (int i = 0; i < n; ++i) cin >> a[i] >> b[i]; sufB[n] = 1; sufB[n + 1] = 1; sufB[n + 2] = 1; sufB[n + 3] = 1; for (int i = n - 1; i >= 0; --i) { sufA[i] = sufA[i + 1] + a[i]; sufB[i] = (sufB[i + 1] * b[i]) % mod; } nextA[n] = n; nextA[n + 1] = n; nextA[n + 2] = n; nextB[n] = n; nextB[n + 1] = n; nextB[n + 2] = n; for (int i = n - 1; i >= 0; --i) { nextA[i] = nextA[i + 1]; nextB[i] = nextB[i + 1]; sufAdditional[i] = sufAdditional[i + 1]; if (a[i] > 0) nextA[i] = i; if (b[i] > 1) nextB[i] = i; if (b[i] == 1) { sufAdditional[i] = (sufAdditional[i] + a[i] * sufB[i]) % mod; } } for (int i = 0; i < q; ++i) { long long x; int l, r; cin >> x >> l >> r; --r; if (x == 0) { if (nextA[l] > r) { cout << "0\n"; continue; } l = nextA[l]; } while (l <= r) { x = max(x + a[l], x * b[l]); x += sufA[l + 1] - sufA[min(r, nextB[l + 1] - 1) + 1]; l = nextB[l + 1]; if (x >= mod) { x %= mod; break; } } if (l > r) { cout << x << '\n'; continue; } x = (x * sufB[l]) % mod; x = (x * modPow(sufB[r + 1], mod - 2)) % mod; long long additional = (sufAdditional[l] - sufAdditional[r + 1]) % mod; additional = (additional + mod) % mod; additional = (additional * modPow(sufB[r + 1], mod - 2)); x = (x + additional) % mod; cout << x << '\n'; } } |
English