#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9+7;
ll power(ll a, ll b){
if(b == 0){
return 1;
}
if(b == 1){
return a;
}
if(b%2 == 0){
return power((a*a)%mod, b/2);
}else{
return (a * power(a, b - 1))%mod;
}
}
ll div(ll a){
return power(a, mod - 2);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
vector<ll> arra(n);
vector<ll> arrb(n);
vector<ll> sum(n);
vector<ll> powa(n+1);
ll sl = 0;
for(int i = 0; i < n; i++){
ll a, b;
cin >> a >> b;
sl += a;
arra[i] = a;
arrb[i] = b;
sum[i] = sl;
}
vector<ll> next(n+1);
vector<ll> powb(n+1);
next[n] = n;
powb[n] = 1;
powa[n] = 0;
for(int i = n - 1; i >= 0; i--){
powa[i] = powa[i+1];
if(arrb[i] == 1){
next[i] = next[i+1];
powa[i] = (powa[i] + arra[i] * powb[i+1])%mod;
}else{
next[i] = i;
}
powb[i] = (powb[i+1] * arrb[i])%mod;
}
for(int q = 0; q < m; q++){
ll x, l ,r;
cin >> x >> l >> r;
// l--;
r--;
while(x < mod and l <= r){
if(arrb[l] > 1 or l == 0){
x = max(arrb[l] * x, x + arra[l]);
l++;
continue;
}
int j = next[l];
if(j > r){
j = r + 1;
}
x = x + sum[j-1] - sum[l-1];
l = j;
}
x = x%mod;
if(l <= r){
ll ar = (mod + powa[l] - powa[r+1])%mod;
x = (x * powb[l] + ar)%mod;
x = (x * div(powb[r+1]))%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 | #include<bits/stdc++.h> using namespace std; using ll = long long; const ll mod = 1e9+7; ll power(ll a, ll b){ if(b == 0){ return 1; } if(b == 1){ return a; } if(b%2 == 0){ return power((a*a)%mod, b/2); }else{ return (a * power(a, b - 1))%mod; } } ll div(ll a){ return power(a, mod - 2); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; vector<ll> arra(n); vector<ll> arrb(n); vector<ll> sum(n); vector<ll> powa(n+1); ll sl = 0; for(int i = 0; i < n; i++){ ll a, b; cin >> a >> b; sl += a; arra[i] = a; arrb[i] = b; sum[i] = sl; } vector<ll> next(n+1); vector<ll> powb(n+1); next[n] = n; powb[n] = 1; powa[n] = 0; for(int i = n - 1; i >= 0; i--){ powa[i] = powa[i+1]; if(arrb[i] == 1){ next[i] = next[i+1]; powa[i] = (powa[i] + arra[i] * powb[i+1])%mod; }else{ next[i] = i; } powb[i] = (powb[i+1] * arrb[i])%mod; } for(int q = 0; q < m; q++){ ll x, l ,r; cin >> x >> l >> r; // l--; r--; while(x < mod and l <= r){ if(arrb[l] > 1 or l == 0){ x = max(arrb[l] * x, x + arra[l]); l++; continue; } int j = next[l]; if(j > r){ j = r + 1; } x = x + sum[j-1] - sum[l-1]; l = j; } x = x%mod; if(l <= r){ ll ar = (mod + powa[l] - powa[r+1])%mod; x = (x * powb[l] + ar)%mod; x = (x * div(powb[r+1]))%mod; } cout << x << '\n'; } } |
English