#include<bits/stdc++.h>
using namespace std;
typedef uint32_t u32;
typedef uint64_t u64;
typedef long long ll;
constexpr int N=5e5+5,P=1e9+7;
inline u32 power(u32 x,u32 y){
u32 ans=1;
while(y)y&1?ans=(u64)ans*x%P:0,x=(u64)x*x%P,y>>=1;
return ans;
}
#define gc getchar_unlocked
#define pc putchar_unlocked
inline int read(){
int x=0; char c=gc();
while(!isdigit(c))c=gc();
while(isdigit(c))x=x*10+c-'0',c=gc();
return x;
}
void write(const int x){
if(x>9)write(x/10);
pc(x%10+'0');
}
int n,q,a[N],b[N];
int f[N],g[N];
u32 sk[N],sb[N];
ll sa[N];
int main(){
n=read(),q=read();
for(int i=0;i<n;i++)a[i]=read(),b[i]=read();
f[n]=g[n]=n;
for(int i=n-1;~i;i--)f[i]=a[i]?i:f[i+1],g[i]=b[i]>1?i:g[i+1];
sk[0]=1;
for(int i=0;i<n;i++){
sa[i+1]=sa[i]+a[i];
if(b[i]==1)sk[i+1]=sk[i],sb[i+1]=(sb[i]+a[i])%P;
else sk[i+1]=(u64)sk[i]*b[i]%P,sb[i+1]=(u64)sb[i]*b[i]%P;
}
while(q--){
ll x=read();
int l=read(),r=read();
if(!x)if((l=min(f[l],r))<r)x=a[l++];
while(x<P&&l<r){
int p=min(g[l],r);
x+=sa[p]-sa[l],l=p;
if(x>=P||l==r)break;
x=max(x+a[l],x*b[l]),l++;
}
x%=P;
if(l<r){
u32 k=(u64)sk[r]*power(sk[l],P-2)%P;
u32 b=(sb[r]-(u64)sb[l]*k%P+P)%P;
x=((u64)x*k+b)%P;
}
write(x),pc('\n');
}
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 | #include<bits/stdc++.h> using namespace std; typedef uint32_t u32; typedef uint64_t u64; typedef long long ll; constexpr int N=5e5+5,P=1e9+7; inline u32 power(u32 x,u32 y){ u32 ans=1; while(y)y&1?ans=(u64)ans*x%P:0,x=(u64)x*x%P,y>>=1; return ans; } #define gc getchar_unlocked #define pc putchar_unlocked inline int read(){ int x=0; char c=gc(); while(!isdigit(c))c=gc(); while(isdigit(c))x=x*10+c-'0',c=gc(); return x; } void write(const int x){ if(x>9)write(x/10); pc(x%10+'0'); } int n,q,a[N],b[N]; int f[N],g[N]; u32 sk[N],sb[N]; ll sa[N]; int main(){ n=read(),q=read(); for(int i=0;i<n;i++)a[i]=read(),b[i]=read(); f[n]=g[n]=n; for(int i=n-1;~i;i--)f[i]=a[i]?i:f[i+1],g[i]=b[i]>1?i:g[i+1]; sk[0]=1; for(int i=0;i<n;i++){ sa[i+1]=sa[i]+a[i]; if(b[i]==1)sk[i+1]=sk[i],sb[i+1]=(sb[i]+a[i])%P; else sk[i+1]=(u64)sk[i]*b[i]%P,sb[i+1]=(u64)sb[i]*b[i]%P; } while(q--){ ll x=read(); int l=read(),r=read(); if(!x)if((l=min(f[l],r))<r)x=a[l++]; while(x<P&&l<r){ int p=min(g[l],r); x+=sa[p]-sa[l],l=p; if(x>=P||l==r)break; x=max(x+a[l],x*b[l]),l++; } x%=P; if(l<r){ u32 k=(u64)sk[r]*power(sk[l],P-2)%P; u32 b=(sb[r]-(u64)sb[l]*k%P+P)%P; x=((u64)x*k+b)%P; } write(x),pc('\n'); } return 0; } |
English