#include <bits/stdc++.h>
#define int long long
#define llu long long unsigned
#define ld long double
#define fr(i,n) for(int i=0;i<n;i++)
#define watch(x) cout<<(#x)<<"=="<<(x)<<endl
#define ft first
#define sc second
#define mp make_pair
#define pb push_back
#define vi vector<int>
#define pii pair<int,int>
#define P 1000000007ll
#define N 500005
#define LC 262144
#define lgM 30ll
#define lgMlgM 35ll
using namespace std;
int getchar_pos_int() {
int n=0, c=getchar();
while('0'<=c&&c<='9') {n=n*10+c-'0'; c=getchar();}
return n;
}
int fastPowModP(int n, int k) {
if(k==0) return 1;
if(k%2==0) return fastPowModP((n*n)%P,k/2);
return (n*fastPowModP((n*n)%P,k/2))%P;
}
int n,q,a[N],b[N],x,l,r, as[N],bp[N], nxt[N];
signed main() {
n=getchar_pos_int(),q=getchar_pos_int();
fr(i,n) as[i]=a[i]=getchar_pos_int(), bp[i]=b[i]=getchar_pos_int();
for (int i=1;i<n;i++) as[i]+=as[i-1], as[i]%=P,bp[i]*=bp[i-1], b[i]%=P;///TODO add modular arithmetic
int prv=0;
for(int i=1;i<n;i++) {
if (b[i]!=1) nxt[prv]=i,prv=i+1;
else prv=i;
}
/* fr(i,n) {
watch(i);watch(a[i]);watch(b[i]);watch(bp[i]);
}*/
fr(i,q) {
// puts("in iq");
x=getchar_pos_int(),l=getchar_pos_int(),r=getchar_pos_int();
int k=l;
fr(i,min(lgM,r-l)) {
fr(j,min(lgMlgM,r-l)) {
if (b[k]==1) {
x+=(P+as[min(r,nxt[k]-1)]-as[k-1])%P,x%=P;
k=min(r+1,nxt[k]);
continue;
}
if (/*b[k]>1&&*/x>a[k]*fastPowModP(b[k]-1,P-2)) {
x*=b[k++], x%=P;
//watch(k);
//watch(x);
break;
} else x+=a[k++], x%=P;
//watch(k);
//watch(x);
if (k>=r) break;
}
if (k>=r) break;
}
//watch(k);
if (k<r-1) x*=bp[r-1]*fastPowModP(bp[k-1],P-2);
printf("%d\n",x);
}
return 0;
}
/*
*10 2
3 2
3 2
3 2
0 1000
0 1000
0 1000
0 1000
0 1000
0 1000
123 1
1 0 3
1 3 9
*/
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 | #include <bits/stdc++.h> #define int long long #define llu long long unsigned #define ld long double #define fr(i,n) for(int i=0;i<n;i++) #define watch(x) cout<<(#x)<<"=="<<(x)<<endl #define ft first #define sc second #define mp make_pair #define pb push_back #define vi vector<int> #define pii pair<int,int> #define P 1000000007ll #define N 500005 #define LC 262144 #define lgM 30ll #define lgMlgM 35ll using namespace std; int getchar_pos_int() { int n=0, c=getchar(); while('0'<=c&&c<='9') {n=n*10+c-'0'; c=getchar();} return n; } int fastPowModP(int n, int k) { if(k==0) return 1; if(k%2==0) return fastPowModP((n*n)%P,k/2); return (n*fastPowModP((n*n)%P,k/2))%P; } int n,q,a[N],b[N],x,l,r, as[N],bp[N], nxt[N]; signed main() { n=getchar_pos_int(),q=getchar_pos_int(); fr(i,n) as[i]=a[i]=getchar_pos_int(), bp[i]=b[i]=getchar_pos_int(); for (int i=1;i<n;i++) as[i]+=as[i-1], as[i]%=P,bp[i]*=bp[i-1], b[i]%=P;///TODO add modular arithmetic int prv=0; for(int i=1;i<n;i++) { if (b[i]!=1) nxt[prv]=i,prv=i+1; else prv=i; } /* fr(i,n) { watch(i);watch(a[i]);watch(b[i]);watch(bp[i]); }*/ fr(i,q) { // puts("in iq"); x=getchar_pos_int(),l=getchar_pos_int(),r=getchar_pos_int(); int k=l; fr(i,min(lgM,r-l)) { fr(j,min(lgMlgM,r-l)) { if (b[k]==1) { x+=(P+as[min(r,nxt[k]-1)]-as[k-1])%P,x%=P; k=min(r+1,nxt[k]); continue; } if (/*b[k]>1&&*/x>a[k]*fastPowModP(b[k]-1,P-2)) { x*=b[k++], x%=P; //watch(k); //watch(x); break; } else x+=a[k++], x%=P; //watch(k); //watch(x); if (k>=r) break; } if (k>=r) break; } //watch(k); if (k<r-1) x*=bp[r-1]*fastPowModP(bp[k-1],P-2); printf("%d\n",x); } return 0; } /* *10 2 3 2 3 2 3 2 0 1000 0 1000 0 1000 0 1000 0 1000 0 1000 123 1 1 0 3 1 3 9 */ |
English