#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5, mod = 1e9 + 7;
int a[N], b[N];
struct node{
int l, r;
int add, mul;
} tree[N << 2];
#define lc (k * 2)
#define rc (k * 2 + 1)
#define mid (tree[k].l + tree[k].r >> 1)
node merge(node l, node r) {
node res; res.l = l.l, res.r = r.r;
res.add = (l.add * r.mul % mod + r.add) % mod;
res.mul = l.mul * r.mul % mod;
return res;
}
void pushup(int k) { tree[k] = merge(tree[lc], tree[rc]); }
void build(int k, int l, int r) {
tree[k].l = l, tree[k].r = r;
if(l == r) { if(a[l] <= 1) tree[k].mul = 1, tree[k].add = b[l]; else tree[k].add = 0, tree[k].mul = a[l]; return; }
build(lc, l, mid), build(rc, mid + 1, r);
pushup(k);
}
node query(int k, int l, int r) {
if(tree[k].l >= l && tree[k].r <= r) return tree[k];
if(r <= mid) return query(lc, l, r);
else if(l > mid) return query(rc, l, r);
else return merge(query(lc, l, mid), query(rc, mid + 1, r));
}
int nxt[N];
int pre[N];
void solve() {
int n, q; cin >> n >> q;
for(int i = 1; i <= n; i++) cin >> b[i] >> a[i];
build(1, 1, n);
for(int i = 1; i <= n; i++)
pre[i] = pre[i - 1] + b[i];
nxt[n + 1] = n + 1;
for(int i = n; i >= 1; i--)
if(a[i] >= 2) nxt[i] = i;
else nxt[i] = nxt[i + 1];
for(int i = 1; i <= q; i++) {
int x, l, r; cin >> x >> l >> r;
bool flag = 0; l++;
while(!flag && l <= r) {
if(a[l] >= 2) {
x = max(x * a[l], x + b[l]);
l++;
} else {
int xxx = min(r, nxt[l] - 1);
x += pre[xxx] - pre[l - 1];
l = xxx + 1;
}
if(x > mod) break;
} x %= mod;
if(l == r + 1) { cout << x << '\n'; continue; }
auto p = query(1, l, r); x *= p.mul; x %= mod; x += p.add; x %= mod;
cout << x << '\n';
}
}
signed main() {
ios::sync_with_stdio(false);
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
// For Problem with file IO
// #ifndef CPH
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
// #endif
int t = 1;
// cin >> t;
while(t--) {
solve();
}
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 | #include<bits/stdc++.h> using namespace std; #define int long long const int N = 5e5 + 5, mod = 1e9 + 7; int a[N], b[N]; struct node{ int l, r; int add, mul; } tree[N << 2]; #define lc (k * 2) #define rc (k * 2 + 1) #define mid (tree[k].l + tree[k].r >> 1) node merge(node l, node r) { node res; res.l = l.l, res.r = r.r; res.add = (l.add * r.mul % mod + r.add) % mod; res.mul = l.mul * r.mul % mod; return res; } void pushup(int k) { tree[k] = merge(tree[lc], tree[rc]); } void build(int k, int l, int r) { tree[k].l = l, tree[k].r = r; if(l == r) { if(a[l] <= 1) tree[k].mul = 1, tree[k].add = b[l]; else tree[k].add = 0, tree[k].mul = a[l]; return; } build(lc, l, mid), build(rc, mid + 1, r); pushup(k); } node query(int k, int l, int r) { if(tree[k].l >= l && tree[k].r <= r) return tree[k]; if(r <= mid) return query(lc, l, r); else if(l > mid) return query(rc, l, r); else return merge(query(lc, l, mid), query(rc, mid + 1, r)); } int nxt[N]; int pre[N]; void solve() { int n, q; cin >> n >> q; for(int i = 1; i <= n; i++) cin >> b[i] >> a[i]; build(1, 1, n); for(int i = 1; i <= n; i++) pre[i] = pre[i - 1] + b[i]; nxt[n + 1] = n + 1; for(int i = n; i >= 1; i--) if(a[i] >= 2) nxt[i] = i; else nxt[i] = nxt[i + 1]; for(int i = 1; i <= q; i++) { int x, l, r; cin >> x >> l >> r; bool flag = 0; l++; while(!flag && l <= r) { if(a[l] >= 2) { x = max(x * a[l], x + b[l]); l++; } else { int xxx = min(r, nxt[l] - 1); x += pre[xxx] - pre[l - 1]; l = xxx + 1; } if(x > mod) break; } x %= mod; if(l == r + 1) { cout << x << '\n'; continue; } auto p = query(1, l, r); x *= p.mul; x %= mod; x += p.add; x %= mod; cout << x << '\n'; } } signed main() { ios::sync_with_stdio(false); ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); // For Problem with file IO // #ifndef CPH // freopen(".in", "r", stdin); // freopen(".out", "w", stdout); // #endif int t = 1; // cin >> t; while(t--) { solve(); } return 0; } |
English