#include<iostream>
#include<vector>
int n,q,a,b,l,r;
long long x;
long long sumsuf[500000];
int nextmul[500000];
int nextadd[500000];
long long drzemul[1100000];
long long drzeadd[1100000];
const int prze=(1<<19);
const long long mod = 1000LL*1000LL*1000LL+7LL;
int main(){
std::ios_base::sync_with_stdio(false);
std::cin>>n>>q;
std::vector<int> ad,mu;
for(int i=0;i<n;i++){
std::cin>>a>>b;
ad.emplace_back(a);
mu.emplace_back(b);
}
int pozmu=n;
int pozadd=n;
long long sum=0;
for(int i=n-1;i>=0;i--){
nextmul[i]=pozmu;
if(ad[i]>0)
pozadd=i;
nextadd[i]=pozadd;
if(mu[i]>1){
pozmu=i;
sum=0;
}else{
sum+=ad[i];
}
sumsuf[i]=sum;
}
for(int i=0;i<n;i++)
if(mu[i]>1){
drzemul[i+prze]=mu[i];
}else{
drzeadd[i+prze]=ad[i];
drzemul[i+prze]=1;
}
for(int i=prze-1;i>=1;i--){
drzeadd[i]=(drzeadd[i*2]*drzemul[i*2+1]+drzeadd[i*2+1])%mod;
drzemul[i]=(drzemul[i*2]*drzemul[i*2+1])%mod;
}
for(int i=0;i<q;i++){
std::cin>>x>>l>>r;
r--;
if(x==0)
l=nextadd[l];
while(x<mod && l<=r){
//std::cout<<"lr "<<l<<" "<<r<<std::endl;
if(x+ad[l]>x*mu[l]){
x+=ad[l];
}else
x*=mu[l];
if(nextmul[l]>r){
l++;
break;
}
if(l<r)
x+=sumsuf[l+1];
l=nextmul[l];
//std::cout<<x<<" "<<l<<std::endl;
}
x%=mod;
//std::cout<<x<<std::endl;
int lw=l+prze;
int rw=r+prze;
std::vector<int> poz;
//std::cout<<l<<" "<<r<<std::endl;
while(lw<rw){
//std::cout<<"LL "<<lw<<" "<<rw<<std::endl;
if(lw%2){
x=(x*drzemul[lw]+drzeadd[lw])%mod;
lw++;
}
if(rw%2==0){
poz.emplace_back(rw);
rw--;
}
lw/=2;
rw/=2;
//std::cout<<x<<std::endl;
}
if(lw==rw)
poz.emplace_back(lw);
for(int i=poz.size()-1;i>=0;i--){
x=(x*drzemul[poz[i]]+drzeadd[poz[i]])%mod;
//std::cout<<drzemul[poz[i]]<<" "<<drzeadd[poz[i]]<<std::endl;
}
std::cout<<x<<std::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 | #include<iostream> #include<vector> int n,q,a,b,l,r; long long x; long long sumsuf[500000]; int nextmul[500000]; int nextadd[500000]; long long drzemul[1100000]; long long drzeadd[1100000]; const int prze=(1<<19); const long long mod = 1000LL*1000LL*1000LL+7LL; int main(){ std::ios_base::sync_with_stdio(false); std::cin>>n>>q; std::vector<int> ad,mu; for(int i=0;i<n;i++){ std::cin>>a>>b; ad.emplace_back(a); mu.emplace_back(b); } int pozmu=n; int pozadd=n; long long sum=0; for(int i=n-1;i>=0;i--){ nextmul[i]=pozmu; if(ad[i]>0) pozadd=i; nextadd[i]=pozadd; if(mu[i]>1){ pozmu=i; sum=0; }else{ sum+=ad[i]; } sumsuf[i]=sum; } for(int i=0;i<n;i++) if(mu[i]>1){ drzemul[i+prze]=mu[i]; }else{ drzeadd[i+prze]=ad[i]; drzemul[i+prze]=1; } for(int i=prze-1;i>=1;i--){ drzeadd[i]=(drzeadd[i*2]*drzemul[i*2+1]+drzeadd[i*2+1])%mod; drzemul[i]=(drzemul[i*2]*drzemul[i*2+1])%mod; } for(int i=0;i<q;i++){ std::cin>>x>>l>>r; r--; if(x==0) l=nextadd[l]; while(x<mod && l<=r){ //std::cout<<"lr "<<l<<" "<<r<<std::endl; if(x+ad[l]>x*mu[l]){ x+=ad[l]; }else x*=mu[l]; if(nextmul[l]>r){ l++; break; } if(l<r) x+=sumsuf[l+1]; l=nextmul[l]; //std::cout<<x<<" "<<l<<std::endl; } x%=mod; //std::cout<<x<<std::endl; int lw=l+prze; int rw=r+prze; std::vector<int> poz; //std::cout<<l<<" "<<r<<std::endl; while(lw<rw){ //std::cout<<"LL "<<lw<<" "<<rw<<std::endl; if(lw%2){ x=(x*drzemul[lw]+drzeadd[lw])%mod; lw++; } if(rw%2==0){ poz.emplace_back(rw); rw--; } lw/=2; rw/=2; //std::cout<<x<<std::endl; } if(lw==rw) poz.emplace_back(lw); for(int i=poz.size()-1;i>=0;i--){ x=(x*drzemul[poz[i]]+drzeadd[poz[i]])%mod; //std::cout<<drzemul[poz[i]]<<" "<<drzeadd[poz[i]]<<std::endl; } std::cout<<x<<std::endl; } } |
English