#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using pll = pair<ll,ll>;
const ll mod = 1e9+7;
const int N = 5e5+5;
pll merge(pll left, pll right){
pll res;
res.first = (left.first * right.first) % mod;
res.second = (left.second * right.first + right.second) % mod;
return res;
}
ll n, q, a[N], b[N], pfx[N], nxt_mult[N];
pll tree[N*4];
void init(int v, int l, int r){
if(l == r){
tree[v].first = b[l] >= 2 ? b[l] : 1;
tree[v].second = b[l] >= 2 ? 0 : a[l];
return;
}
int mid = (l+r)/2;
init(v*2, l, mid);
init(v*2+1, mid+1, r);
tree[v] = merge(tree[v*2], tree[v*2+1]);
}
pll query(int v, int ql, int qr, int l = 1, int r = n){
if(qr < l || r < ql) return {1, 0};
if(ql <= l && r <= qr) return tree[v];
int mid = (l+r)/2;
return merge(query(v*2, ql, qr, l, mid), query(v*2+1, ql, qr, mid+1, r));
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> q;
for(int i = 1; i <= n; ++i){
cin >> a[i] >> b[i];
pfx[i] = pfx[i-1]+a[i];
}
nxt_mult[n+1] = n+1;
for(int i = n; i; --i) nxt_mult[i] = b[i] >= 2 ? i : nxt_mult[i+1];
init(1, 1, n);
for(;q--;){
ll x, l, r; cin >> x >> l >> r;
l++;
for(;l <= r;){
if(x > mod){
pll res = query(1, l, r);
x = (res.first * (x%mod) + res.second)%mod;
break;
}
int nxt = nxt_mult[l];
if(nxt > r){
x += pfx[r]-pfx[l-1];
break;
}
x += pfx[nxt-1]-pfx[l-1];
l = nxt;
if(x > mod) continue;
x = max(x*b[l], x+a[l]);
l++;
}
cout << x%mod << '\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 | #include "bits/stdc++.h" using namespace std; using ll = long long; using pll = pair<ll,ll>; const ll mod = 1e9+7; const int N = 5e5+5; pll merge(pll left, pll right){ pll res; res.first = (left.first * right.first) % mod; res.second = (left.second * right.first + right.second) % mod; return res; } ll n, q, a[N], b[N], pfx[N], nxt_mult[N]; pll tree[N*4]; void init(int v, int l, int r){ if(l == r){ tree[v].first = b[l] >= 2 ? b[l] : 1; tree[v].second = b[l] >= 2 ? 0 : a[l]; return; } int mid = (l+r)/2; init(v*2, l, mid); init(v*2+1, mid+1, r); tree[v] = merge(tree[v*2], tree[v*2+1]); } pll query(int v, int ql, int qr, int l = 1, int r = n){ if(qr < l || r < ql) return {1, 0}; if(ql <= l && r <= qr) return tree[v]; int mid = (l+r)/2; return merge(query(v*2, ql, qr, l, mid), query(v*2+1, ql, qr, mid+1, r)); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> q; for(int i = 1; i <= n; ++i){ cin >> a[i] >> b[i]; pfx[i] = pfx[i-1]+a[i]; } nxt_mult[n+1] = n+1; for(int i = n; i; --i) nxt_mult[i] = b[i] >= 2 ? i : nxt_mult[i+1]; init(1, 1, n); for(;q--;){ ll x, l, r; cin >> x >> l >> r; l++; for(;l <= r;){ if(x > mod){ pll res = query(1, l, r); x = (res.first * (x%mod) + res.second)%mod; break; } int nxt = nxt_mult[l]; if(nxt > r){ x += pfx[r]-pfx[l-1]; break; } x += pfx[nxt-1]-pfx[l-1]; l = nxt; if(x > mod) continue; x = max(x*b[l], x+a[l]); l++; } cout << x%mod << '\n'; } } |
English