#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
const int N = 5e5 + 4;
const ll MOD = 1e9 + 7;
pll tab[N];
ll prefSum[N];
ll prefMult[N];
ll multSum[N];
int firstMultToR[N];
ll inv(ll x, ll a = MOD - 2){
if(a == 0) return 1;
ll t = inv(x, a / 2);
return ((a % 2) ? ((t * t) % MOD) * x : t * t) % MOD;
}
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int n, q;
cin >> n >> q;
prefMult[0] = 1;
for(int i = 1 ; i <= n ; i++){
cin >> tab[i].first >> tab[i].second;
prefSum[i] = prefSum[i - 1] + tab[i].first;
prefMult[i] = (prefMult[i - 1] * tab[i].second) % MOD;
if(tab[i].second == 1){
multSum[i] = (multSum[i - 1] + tab[i].first) % MOD;
}else{
multSum[i] = (multSum[i - 1] * tab[i].second) % MOD;
}
}
int idx = n + 1;
for(int i = n ; i >= 1 ; i--){
firstMultToR[i] = idx;
if(tab[i].second != 1) idx = i;
}
while(q--){
int x, l, r;
cin >> x >> l >> r;
ll ans = x;
l++;
while(ans < MOD){
if(ans + tab[l].first > ans * tab[l].second){
ans += tab[l].first;
}else{
ans *= tab[l].second;
}
idx = firstMultToR[l];
if(r < idx){
ans += prefSum[r] - prefSum[l];
l = r + 1;
break;
}
ans += prefSum[idx - 1] - prefSum[l];
l = idx;
}
ans %= MOD;
if(l <= r){
ll multLR = (prefMult[r] * inv(prefMult[l - 1])) % MOD;
ans = (ans * multLR) % MOD;
ans += multSum[r] - ((multSum[l - 1] * multLR) % MOD);
if(ans < 0) ans += MOD;
else ans %= MOD;
}
cout << ans << '\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 | #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; const int N = 5e5 + 4; const ll MOD = 1e9 + 7; pll tab[N]; ll prefSum[N]; ll prefMult[N]; ll multSum[N]; int firstMultToR[N]; ll inv(ll x, ll a = MOD - 2){ if(a == 0) return 1; ll t = inv(x, a / 2); return ((a % 2) ? ((t * t) % MOD) * x : t * t) % MOD; } int main(){ cin.tie(0); ios_base::sync_with_stdio(0); int n, q; cin >> n >> q; prefMult[0] = 1; for(int i = 1 ; i <= n ; i++){ cin >> tab[i].first >> tab[i].second; prefSum[i] = prefSum[i - 1] + tab[i].first; prefMult[i] = (prefMult[i - 1] * tab[i].second) % MOD; if(tab[i].second == 1){ multSum[i] = (multSum[i - 1] + tab[i].first) % MOD; }else{ multSum[i] = (multSum[i - 1] * tab[i].second) % MOD; } } int idx = n + 1; for(int i = n ; i >= 1 ; i--){ firstMultToR[i] = idx; if(tab[i].second != 1) idx = i; } while(q--){ int x, l, r; cin >> x >> l >> r; ll ans = x; l++; while(ans < MOD){ if(ans + tab[l].first > ans * tab[l].second){ ans += tab[l].first; }else{ ans *= tab[l].second; } idx = firstMultToR[l]; if(r < idx){ ans += prefSum[r] - prefSum[l]; l = r + 1; break; } ans += prefSum[idx - 1] - prefSum[l]; l = idx; } ans %= MOD; if(l <= r){ ll multLR = (prefMult[r] * inv(prefMult[l - 1])) % MOD; ans = (ans * multLR) % MOD; ans += multSum[r] - ((multSum[l - 1] * multLR) % MOD); if(ans < 0) ans += MOD; else ans %= MOD; } cout << ans << '\n'; } } |
English