#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 1e9 + 7;
struct pfsum {
vector<int> a;
pfsum(vector<int> aa) : a(aa) {
for (int i = 1; i < (int)a.size(); i++) {
a[i] += a[i - 1];
}
}
int operator()(int x, int y) {
return a[y] - a[x - 1];
}
};
struct nxtbig {
vector<int> b, nxt;
nxtbig(vector<int> b) : b(b) {
nxt.resize(b.size());
int cur = b.size();
for (int i = b.size() - 1; i >= 0; i--) {
if (b[i] > 1)
cur = i;
nxt[i] = cur;
}
}
int operator[](int i) {
return nxt[i];
}
};
struct segtree {
int L = 1;
vector<int> add, mul;
segtree(const vector<int> &a, const vector<int> &b) {
int n = a.size();
while (L < n) L <<= 1;
add.resize(L * 2);
mul.resize(L * 2, 1);
for (int i = 0; i < n; i++) {
if (b[i] <= 1) {
add[L + i] = a[i];
mul[L + i] = 1;
}
else {
add[L + i] = 0;
mul[L + i] = b[i];
}
}
for (int i = L - 1; i > 0; i--) {
int l = i << 1, p = l + 1;
add[i] = (add[l] * mul[p] + add[p]) % MOD;
mul[i] = (mul[l] * mul[p]) % MOD;
}
}
void query(int w, int p, int k, int x, int y, int &a, int &b) {
if (x <= p && k <= y) {
a = (a * mul[w] + add[w]) % MOD;
b = (b * mul[w]) % MOD;
return;
}
int sr = (p + k) / 2;
if (x <= sr) query(w << 1, p, sr, x, y, a, b);
if (y > sr) query(w << 1 | 1, sr + 1, k, x, y, a, b);
}
};
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, q; cin >> n >> q;
vector<int>a(n + 1), b(n + 1);
a[0] = 0; b[0] = 1;
for (int i = 1; i <= n; i++)
cin >> a[i] >> b[i];
pfsum sum(a);
nxtbig nxt(b);
segtree st(a, b);
for (int i = 0; i < q; i++) {
int x, l, r; cin >> x >> l >> r;
l++;
while (l <= r && x < MOD) {
// cout << " " << i << " " << x << " " << l << " " << nxt[l] << endl;
int nx = min(nxt[l], r);
x += sum(l, nx - 1);
if (x > MOD) {
l = nx;
break;
}
// cout << " " << i << " " << x << " " << l << " " << nxt[l] << endl;
if (x + a[nx] < x * b[nx])
x *= b[nx];
else
x += a[nx];
l = nx + 1;
}
x %= MOD;
// cout << x << " " << l << endl;
if (l <= r) {
int mul = 1;
st.query(1, 0, st.L - 1, l, r, x, mul);
// cout << "AM " << mul << endl;
}
cout << x << "\n";
}
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 | #include <bits/stdc++.h> #define int long long using namespace std; const int MOD = 1e9 + 7; struct pfsum { vector<int> a; pfsum(vector<int> aa) : a(aa) { for (int i = 1; i < (int)a.size(); i++) { a[i] += a[i - 1]; } } int operator()(int x, int y) { return a[y] - a[x - 1]; } }; struct nxtbig { vector<int> b, nxt; nxtbig(vector<int> b) : b(b) { nxt.resize(b.size()); int cur = b.size(); for (int i = b.size() - 1; i >= 0; i--) { if (b[i] > 1) cur = i; nxt[i] = cur; } } int operator[](int i) { return nxt[i]; } }; struct segtree { int L = 1; vector<int> add, mul; segtree(const vector<int> &a, const vector<int> &b) { int n = a.size(); while (L < n) L <<= 1; add.resize(L * 2); mul.resize(L * 2, 1); for (int i = 0; i < n; i++) { if (b[i] <= 1) { add[L + i] = a[i]; mul[L + i] = 1; } else { add[L + i] = 0; mul[L + i] = b[i]; } } for (int i = L - 1; i > 0; i--) { int l = i << 1, p = l + 1; add[i] = (add[l] * mul[p] + add[p]) % MOD; mul[i] = (mul[l] * mul[p]) % MOD; } } void query(int w, int p, int k, int x, int y, int &a, int &b) { if (x <= p && k <= y) { a = (a * mul[w] + add[w]) % MOD; b = (b * mul[w]) % MOD; return; } int sr = (p + k) / 2; if (x <= sr) query(w << 1, p, sr, x, y, a, b); if (y > sr) query(w << 1 | 1, sr + 1, k, x, y, a, b); } }; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin >> n >> q; vector<int>a(n + 1), b(n + 1); a[0] = 0; b[0] = 1; for (int i = 1; i <= n; i++) cin >> a[i] >> b[i]; pfsum sum(a); nxtbig nxt(b); segtree st(a, b); for (int i = 0; i < q; i++) { int x, l, r; cin >> x >> l >> r; l++; while (l <= r && x < MOD) { // cout << " " << i << " " << x << " " << l << " " << nxt[l] << endl; int nx = min(nxt[l], r); x += sum(l, nx - 1); if (x > MOD) { l = nx; break; } // cout << " " << i << " " << x << " " << l << " " << nxt[l] << endl; if (x + a[nx] < x * b[nx]) x *= b[nx]; else x += a[nx]; l = nx + 1; } x %= MOD; // cout << x << " " << l << endl; if (l <= r) { int mul = 1; st.query(1, 0, st.L - 1, l, r, x, mul); // cout << "AM " << mul << endl; } cout << x << "\n"; } return 0; } |
English