#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7, K = 30;
int mul(int a, int b){
return (a*b)%mod;
}
void add(int &a, int b){
a += b;
if (a >= mod) a-=mod;
}
void sub(int &a, int b){
a -= b;
if (a < 0) a+=mod;
}
int power(int a, int b){
if (!b) return 1ll;
int k = power(a, b/2);
k = mul(k, k);
if (b&1) k = mul(k, a);
return k;
}
void solve() {
int n, q; cin >> n >> q;
vector<int>a(n+1), b(n+1), pref(n+1);
vector<int>nast(n+2, -1), nastniezero(n+2, -1);
vector<int>A(n+1, 1), B(n+1);// invA(n+1, 1);
for (int i = 1; i<=n; i++) {
cin >> a[i] >> b[i];
pref[i] = pref[i - 1] + a[i];
A[i] = A[i - 1];
B[i] = B[i - 1];
if (b[i] == 1) {
add(B[i], a[i]);
} else {
A[i] = mul(A[i], b[i]);
}
// invA[i] = power(A[i], mod-2);
}
vector<int>C(n+2), suf(n+2, 1);// invsuf(n+2, 1);
for (int i = n; i >= 1; i--) {
C[i] = C[i + 1];
suf[i] = suf[i + 1];
if (b[i] == 1) {
add(C[i], mul(a[i], suf[i]));
} else {
suf[i] = mul(suf[i], b[i]);
}
// invsuf[i] = power(suf[i], mod - 2);
}
for (int i = n; i >= 1; i--){
nast[i] = nast[i + 1];
nastniezero[i] = nastniezero[i + 1];
if (b[i] >= 2) nast[i] = i;
if (a[i] != 0) nastniezero[i] = i;
}
while (q--) {
int x, l, r; cin >> x >> l >> r;
int i = l + 1;
if (x == 0) {
i = nastniezero[i];
if (i == -1 || i > r) {
cout << "0\n";
continue;
}
}
while (i <= r) {
if (x >= mod) {
x %= mod;
x = mul(x, mul(A[r], power(A[i - 1], mod - 2)));
int inv = power(suf[r + 1], mod - 2);
int skl = C[i];
sub(skl, C[r+1]);
add(x, mul(skl, inv));
// add(x, mul(C[i], invsuf[r + 1]));
// sub(x, mul(C[r + 1], invsuf[r + 1]));
break;
}
if (nast[i] == -1 || nast[i] > r) {
// wszedzie dalej bi = 1
add(x, pref[r]);
sub(x, pref[i - 1]);
break;
}
int j = nast[i];
x += pref[j - 1] - pref[i - 1];
if (a[j] + x >= b[j] * x) {
x += a[j];
} else {
x *= b[j];
}
i = j + 1;
}
cout << x % mod << "\n";
}
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 1e9+7, K = 30; int mul(int a, int b){ return (a*b)%mod; } void add(int &a, int b){ a += b; if (a >= mod) a-=mod; } void sub(int &a, int b){ a -= b; if (a < 0) a+=mod; } int power(int a, int b){ if (!b) return 1ll; int k = power(a, b/2); k = mul(k, k); if (b&1) k = mul(k, a); return k; } void solve() { int n, q; cin >> n >> q; vector<int>a(n+1), b(n+1), pref(n+1); vector<int>nast(n+2, -1), nastniezero(n+2, -1); vector<int>A(n+1, 1), B(n+1);// invA(n+1, 1); for (int i = 1; i<=n; i++) { cin >> a[i] >> b[i]; pref[i] = pref[i - 1] + a[i]; A[i] = A[i - 1]; B[i] = B[i - 1]; if (b[i] == 1) { add(B[i], a[i]); } else { A[i] = mul(A[i], b[i]); } // invA[i] = power(A[i], mod-2); } vector<int>C(n+2), suf(n+2, 1);// invsuf(n+2, 1); for (int i = n; i >= 1; i--) { C[i] = C[i + 1]; suf[i] = suf[i + 1]; if (b[i] == 1) { add(C[i], mul(a[i], suf[i])); } else { suf[i] = mul(suf[i], b[i]); } // invsuf[i] = power(suf[i], mod - 2); } for (int i = n; i >= 1; i--){ nast[i] = nast[i + 1]; nastniezero[i] = nastniezero[i + 1]; if (b[i] >= 2) nast[i] = i; if (a[i] != 0) nastniezero[i] = i; } while (q--) { int x, l, r; cin >> x >> l >> r; int i = l + 1; if (x == 0) { i = nastniezero[i]; if (i == -1 || i > r) { cout << "0\n"; continue; } } while (i <= r) { if (x >= mod) { x %= mod; x = mul(x, mul(A[r], power(A[i - 1], mod - 2))); int inv = power(suf[r + 1], mod - 2); int skl = C[i]; sub(skl, C[r+1]); add(x, mul(skl, inv)); // add(x, mul(C[i], invsuf[r + 1])); // sub(x, mul(C[r + 1], invsuf[r + 1])); break; } if (nast[i] == -1 || nast[i] > r) { // wszedzie dalej bi = 1 add(x, pref[r]); sub(x, pref[i - 1]); break; } int j = nast[i]; x += pref[j - 1] - pref[i - 1]; if (a[j] + x >= b[j] * x) { x += a[j]; } else { x *= b[j]; } i = j + 1; } cout << x % mod << "\n"; } } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); solve(); return 0; } |
English