#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int mod = 1e9+7;
int prsm[500001];
int sfdb[500001];
int prsm1[500001];
int bp(int a,int p){
if(p == 0){
return 1;
}
if(p&1){
return a*bp(a,p-1);
}
int x = bp(a,p/2);
return (x*x)%mod;
}
int dv(int a,int b){
return (a*bp(b,mod-2))%mod;
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,q;
cin>>n>>q;
int a[n],b[n];
for(int i = 0;i<n;i++){
cin>>a[i]>>b[i];
}
int nxt0[n+1],nxt2[n+1];
nxt0[n] = nxt2[n] = n;
for(int i = n-1;i>=0;i--){
nxt0[i] = nxt0[i+1];
nxt2[i] = nxt2[i+1];
if(a[i] != 0){
nxt0[i] = i;
}
if(b[i] > 1){
nxt2[i] = i;
}
}
int dbb = 1;
for(int i = n-1;i>=0;i--){
if(b[i] == 1){
prsm[i+1] = (a[i]*dbb)%mod;
}
prsm1[i+1] = a[i];
dbb *= b[i];
dbb %= mod;
}
for(int i = 1;i<=n;i++){
prsm[i] += prsm[i-1];
prsm[i] %= mod;
prsm1[i] += prsm1[i-1];
prsm1[i] %= mod;
}
sfdb[n] = 1;
for(int i = n-1;i>=0;i--){
sfdb[i] = sfdb[i+1]*b[i];
sfdb[i] %= mod;
}
for(int i = 0;i<q;i++){
int x,l,r;
cin>>x>>l>>r;
r--;
if(x == 0){
if(nxt0[l] > r){
l = r+1;
}
else{
l = nxt0[l]+1;
x = a[l-1];
}
}
while(x < 1e9+7 && l <= r){
int ps = nxt2[l];
if(ps > r){
x += prsm1[r]-prsm1[l];
l = ps;
}
else{
x += prsm1[ps]-prsm1[l];
if(x*b[ps] > x+a[ps]){
x *= b[ps];
}
else{
x += a[ps];
}
l = ps+1;
}
}
if(l > r){
cout<<x%mod<<endl;
}
else{
x %= mod;
x *= sfdb[l];
x %= mod;
x += prsm[r+1]-prsm[l];
x += mod;
x %= mod;
x = dv(x,sfdb[r+1]);
cout<<x%mod<<endl;
}
}
}
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 | #pragma GCC optimize("Ofast") #pragma GCC optimize("O3,unroll-loops") #include <bits/stdc++.h> #define int long long using namespace std; constexpr int mod = 1e9+7; int prsm[500001]; int sfdb[500001]; int prsm1[500001]; int bp(int a,int p){ if(p == 0){ return 1; } if(p&1){ return a*bp(a,p-1); } int x = bp(a,p/2); return (x*x)%mod; } int dv(int a,int b){ return (a*bp(b,mod-2))%mod; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; int a[n],b[n]; for(int i = 0;i<n;i++){ cin>>a[i]>>b[i]; } int nxt0[n+1],nxt2[n+1]; nxt0[n] = nxt2[n] = n; for(int i = n-1;i>=0;i--){ nxt0[i] = nxt0[i+1]; nxt2[i] = nxt2[i+1]; if(a[i] != 0){ nxt0[i] = i; } if(b[i] > 1){ nxt2[i] = i; } } int dbb = 1; for(int i = n-1;i>=0;i--){ if(b[i] == 1){ prsm[i+1] = (a[i]*dbb)%mod; } prsm1[i+1] = a[i]; dbb *= b[i]; dbb %= mod; } for(int i = 1;i<=n;i++){ prsm[i] += prsm[i-1]; prsm[i] %= mod; prsm1[i] += prsm1[i-1]; prsm1[i] %= mod; } sfdb[n] = 1; for(int i = n-1;i>=0;i--){ sfdb[i] = sfdb[i+1]*b[i]; sfdb[i] %= mod; } for(int i = 0;i<q;i++){ int x,l,r; cin>>x>>l>>r; r--; if(x == 0){ if(nxt0[l] > r){ l = r+1; } else{ l = nxt0[l]+1; x = a[l-1]; } } while(x < 1e9+7 && l <= r){ int ps = nxt2[l]; if(ps > r){ x += prsm1[r]-prsm1[l]; l = ps; } else{ x += prsm1[ps]-prsm1[l]; if(x*b[ps] > x+a[ps]){ x *= b[ps]; } else{ x += a[ps]; } l = ps+1; } } if(l > r){ cout<<x%mod<<endl; } else{ x %= mod; x *= sfdb[l]; x %= mod; x += prsm[r+1]-prsm[l]; x += mod; x %= mod; x = dv(x,sfdb[r+1]); cout<<x%mod<<endl; } } } |
English