#include<bits/stdc++.h>
using namespace std;
const long long mod=(int)1e9+7;
vector<long long>A,B;
vector<long long>aa,bb;
vector<long long>Suma;
vector<long long>Iloczyn;
vector<int>Nastepny,Nastepny2;
long long QuickPow(long long a, long long b)
{
long long wyn=1;
while(b>0)
{
if(b%2==1){wyn=(wyn*a)%mod;}
a=(a*a)%mod;
b>>=1;
}
return wyn;
}
pair<long long,long long>ObliczZiomow(long long a1, long long b1, long long a3, long long b3)
{
long long a2,b2;
a2=(a3*QuickPow(a1,mod-2))%mod;
b2=(b3-(a2*b1)%mod+mod)%mod;
return {a2,b2};
}
int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,q;
cin>>n>>q;
A.resize(n+1);
B.resize(n+1);
aa.resize(n+1);
bb.resize(n+1);
Suma.resize(n+1);
Iloczyn.resize(n+1);
Nastepny.resize(n+1);
Nastepny2.resize(n+1);
Iloczyn[0]=1;
aa[0]=1;
bb[0]=0;
for(int i=1;i<=n;i++)
{
cin>>A[i]>>B[i];
Suma[i]=Suma[i-1]+A[i];
Iloczyn[i]=(Iloczyn[i-1]*B[i])%mod;
if(B[i]>1)
{
aa[i]=(aa[i-1]*B[i])%mod;
bb[i]=(bb[i-1]*B[i])%mod;
}
else
{
aa[i]=aa[i-1];
bb[i]=(bb[i-1]+A[i])%mod;
}
}
Nastepny[n]=n;
Nastepny2[n]=n;
for(int i=n-1;i>=1;i--)
{
if(B[i]>1){Nastepny[i]=i;}
else{Nastepny[i]=Nastepny[i+1];}
if(A[i]>0){Nastepny2[i]=i;}
else{Nastepny2[i]=Nastepny2[i+1];}
}
for(int i=1;i<=q;i++)
{
long long x;
int l,p;
cin>>x>>l>>p;
l++;
if(x==0)
{
l=Nastepny2[l];
if(l>p){cout<<0<<'\n';continue;}
x=A[l];
l++;
}
while(l<=p)
{
int l2=min(p,Nastepny[l]);
x+=Suma[l2-1]-Suma[l-1];
__int128 temp=max((__int128)x*B[l2],(__int128)x+A[l2]);
l=l2+1;
if(temp >= mod){x=(long long)(temp%(__int128)mod);break;}
x=temp;
}
if(l<=p)
{
long long a2,b2;
tie(a2,b2) = ObliczZiomow(aa[l-1],bb[l-1],aa[p],bb[p]);
x=(x*a2+b2)%mod;
}
cout<<x<<'\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 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 | #include<bits/stdc++.h> using namespace std; const long long mod=(int)1e9+7; vector<long long>A,B; vector<long long>aa,bb; vector<long long>Suma; vector<long long>Iloczyn; vector<int>Nastepny,Nastepny2; long long QuickPow(long long a, long long b) { long long wyn=1; while(b>0) { if(b%2==1){wyn=(wyn*a)%mod;} a=(a*a)%mod; b>>=1; } return wyn; } pair<long long,long long>ObliczZiomow(long long a1, long long b1, long long a3, long long b3) { long long a2,b2; a2=(a3*QuickPow(a1,mod-2))%mod; b2=(b3-(a2*b1)%mod+mod)%mod; return {a2,b2}; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,q; cin>>n>>q; A.resize(n+1); B.resize(n+1); aa.resize(n+1); bb.resize(n+1); Suma.resize(n+1); Iloczyn.resize(n+1); Nastepny.resize(n+1); Nastepny2.resize(n+1); Iloczyn[0]=1; aa[0]=1; bb[0]=0; for(int i=1;i<=n;i++) { cin>>A[i]>>B[i]; Suma[i]=Suma[i-1]+A[i]; Iloczyn[i]=(Iloczyn[i-1]*B[i])%mod; if(B[i]>1) { aa[i]=(aa[i-1]*B[i])%mod; bb[i]=(bb[i-1]*B[i])%mod; } else { aa[i]=aa[i-1]; bb[i]=(bb[i-1]+A[i])%mod; } } Nastepny[n]=n; Nastepny2[n]=n; for(int i=n-1;i>=1;i--) { if(B[i]>1){Nastepny[i]=i;} else{Nastepny[i]=Nastepny[i+1];} if(A[i]>0){Nastepny2[i]=i;} else{Nastepny2[i]=Nastepny2[i+1];} } for(int i=1;i<=q;i++) { long long x; int l,p; cin>>x>>l>>p; l++; if(x==0) { l=Nastepny2[l]; if(l>p){cout<<0<<'\n';continue;} x=A[l]; l++; } while(l<=p) { int l2=min(p,Nastepny[l]); x+=Suma[l2-1]-Suma[l-1]; __int128 temp=max((__int128)x*B[l2],(__int128)x+A[l2]); l=l2+1; if(temp >= mod){x=(long long)(temp%(__int128)mod);break;} x=temp; } if(l<=p) { long long a2,b2; tie(a2,b2) = ObliczZiomow(aa[l-1],bb[l-1],aa[p],bb[p]); x=(x*a2+b2)%mod; } cout<<x<<'\n'; } return 0; } |
English