#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int mod = 1e9 + 7, nax = 500 * 1000 + 10;
int n, q;
int a[nax], b[nax];
ll prefix_sum[nax];
int nxt[nax], non_zero[nax];
pair<int, int> T[(1 << 21)];
int fastpow(int x, int y) {
int r = 1;
while (y) {
if (y & 1) r = ((ll)r * x) % mod;
x = ((ll)x * x) % mod;
y /= 2;
}
return r;
}
int R;
pair<int, int> merge(pair<int,int>c, pair<int,int>d) {
auto [x1,y1] = c;
auto [x2,y2] = d;
int x = ((ll)x1 * y2 + x2) % mod;
int y = ((ll)y1 * y2) % mod;
return {x, y};
}
pair<int, int> query(int l, int r) {
l += R, r += R;
pair<int, int> ansl = T[l], ansr = {0,1};
if (l != r) ansr = T[r];
while (l/2 != r/2) {
if (l%2==0) {
ansl = merge(ansl, T[l^1]);
}
if (r%2==1) {
ansr = merge(T[r^1], ansr);
}
l /= 2;
r /= 2;
}
return merge(ansl, ansr);
}
void solve() {
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
cin >> a[i] >> b[i];
}
R = 2;
while (R < n) {
R *= 2;
}
for (int i = 1; i <= R; ++i) {
int x = 0, y = 1;
if (i <= n) {
if (b[i] == 1) {
x = a[i];
} else {
y = b[i];
}
}
T[i + R - 1] = {x, y};
}
for (int i = R - 1; i >= 1; --i) {
T[i] = merge(T[2 * i], T[2*i+1]);
}
for (int i = 1; i <= n; ++i) {
prefix_sum[i] = prefix_sum[i - 1];
if (b[i] == 1) {
prefix_sum[i] += a[i];
}
}
int last = n + 1;
int last_non_zero = n + 1;
for (int i = n; i >= 1; --i) {
nxt[i] = last;
non_zero[i] = last_non_zero;
if (b[i] != 1) {
last = i;
}
if (a[i] != 0) {
last_non_zero = i;
}
}
while (q--) {
ll x;
int l, r;
cin >> x >> l >> r;
l++;
if (x == 0 && a[l] == 0) {
l = non_zero[l];
}
while (x <= mod && l <= r) {
if (x + a[l] >= x * b[l]) {
x += a[l];
} else {
x *= b[l];
}
int jump = min(r + 1, nxt[l]);
x += (prefix_sum[jump - 1] - prefix_sum[l]);
l = jump;
}
x %= mod;
pair<int, int> transform = {0, 1};
if (l <= r) {
transform = query(l-1, r-1);
}
x = ((ll)x * transform.second + transform.first) % mod;
/*
while (l <= r) {
if (b[l] == 1) {
x = (x + a[l]) % mod;
} else {
x = (x * b[l]) % mod;
}
l++;
}
*/
cout << (x % mod) << "\n";
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
}
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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #include <bits/stdc++.h> using namespace std; using ll = long long; const int mod = 1e9 + 7, nax = 500 * 1000 + 10; int n, q; int a[nax], b[nax]; ll prefix_sum[nax]; int nxt[nax], non_zero[nax]; pair<int, int> T[(1 << 21)]; int fastpow(int x, int y) { int r = 1; while (y) { if (y & 1) r = ((ll)r * x) % mod; x = ((ll)x * x) % mod; y /= 2; } return r; } int R; pair<int, int> merge(pair<int,int>c, pair<int,int>d) { auto [x1,y1] = c; auto [x2,y2] = d; int x = ((ll)x1 * y2 + x2) % mod; int y = ((ll)y1 * y2) % mod; return {x, y}; } pair<int, int> query(int l, int r) { l += R, r += R; pair<int, int> ansl = T[l], ansr = {0,1}; if (l != r) ansr = T[r]; while (l/2 != r/2) { if (l%2==0) { ansl = merge(ansl, T[l^1]); } if (r%2==1) { ansr = merge(T[r^1], ansr); } l /= 2; r /= 2; } return merge(ansl, ansr); } void solve() { cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> a[i] >> b[i]; } R = 2; while (R < n) { R *= 2; } for (int i = 1; i <= R; ++i) { int x = 0, y = 1; if (i <= n) { if (b[i] == 1) { x = a[i]; } else { y = b[i]; } } T[i + R - 1] = {x, y}; } for (int i = R - 1; i >= 1; --i) { T[i] = merge(T[2 * i], T[2*i+1]); } for (int i = 1; i <= n; ++i) { prefix_sum[i] = prefix_sum[i - 1]; if (b[i] == 1) { prefix_sum[i] += a[i]; } } int last = n + 1; int last_non_zero = n + 1; for (int i = n; i >= 1; --i) { nxt[i] = last; non_zero[i] = last_non_zero; if (b[i] != 1) { last = i; } if (a[i] != 0) { last_non_zero = i; } } while (q--) { ll x; int l, r; cin >> x >> l >> r; l++; if (x == 0 && a[l] == 0) { l = non_zero[l]; } while (x <= mod && l <= r) { if (x + a[l] >= x * b[l]) { x += a[l]; } else { x *= b[l]; } int jump = min(r + 1, nxt[l]); x += (prefix_sum[jump - 1] - prefix_sum[l]); l = jump; } x %= mod; pair<int, int> transform = {0, 1}; if (l <= r) { transform = query(l-1, r-1); } x = ((ll)x * transform.second + transform.first) % mod; /* while (l <= r) { if (b[l] == 1) { x = (x + a[l]) % mod; } else { x = (x * b[l]) % mod; } l++; } */ cout << (x % mod) << "\n"; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); solve(); } |
English