// Jakub Trela
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll M = 1e9 + 7;
ll pot(ll a, ll b = M-2){
if(b == 0) return 1;
if(b % 2 == 0){
ll w = pot(a, b/2);
return (w * w) % M;
}else{
ll w = pot(a, b-1);
return (w * a) % M;
}
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int n, q;
cin >> n >> q;
vector<ll> tabA(n+1);
vector<ll> tabB(n+1);
vector<ll> prefA(n+1);
vector<ll> prefB(n+1, 1);
vector<ll> prefX(n+1);
vector<int> end(n+1);
for(int i = 1; i <= n; i++){
cin >> tabA[i] >> tabB[i];
if(tabB[i] == 1) {
prefA[i] = tabA[i];
prefX[i] = tabA[i];
}
prefA[i] += prefA[i-1];
prefB[i] = (prefB[i-1] * tabB[i]) % M;
prefX[i] += prefX[i-1];
prefX[i] *= tabB[i];
prefX[i] %= M;
}
int last = n+1;
for(int i = n; i >= 1; i--){
if(tabB[i] == 1){
end[i] = last - 1;
}else{
last = i;
}
}
for(int i = 0; i < q; i++){
ll x;
int l, r;
cin >> x >> l >> r;
bool flag = true;
l++;
while(l <= r){
if(tabB[l] == 1){
int k = min(end[l], r);
x += prefA[k] - prefA[l-1];
l = k+1;
}else{
x = max(x + tabA[l], x * tabB[l]);
l++;
}
if(x >= M){
x %= M;
break;
}
}
if(l > r){
cout << x << '\n';
continue;
}
ll prod = (prefB[r] * pot(prefB[l-1])) % M;
x *= prod;
x %= M;
x += (prefX[r] - (prefX[l-1] * prod) % M + M) % M;
x %= M;
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 | // Jakub Trela #include <bits/stdc++.h> using namespace std; typedef long long ll; ll M = 1e9 + 7; ll pot(ll a, ll b = M-2){ if(b == 0) return 1; if(b % 2 == 0){ ll w = pot(a, b/2); return (w * w) % M; }else{ ll w = pot(a, b-1); return (w * a) % M; } } int main(){ cin.tie(0)->sync_with_stdio(0); int n, q; cin >> n >> q; vector<ll> tabA(n+1); vector<ll> tabB(n+1); vector<ll> prefA(n+1); vector<ll> prefB(n+1, 1); vector<ll> prefX(n+1); vector<int> end(n+1); for(int i = 1; i <= n; i++){ cin >> tabA[i] >> tabB[i]; if(tabB[i] == 1) { prefA[i] = tabA[i]; prefX[i] = tabA[i]; } prefA[i] += prefA[i-1]; prefB[i] = (prefB[i-1] * tabB[i]) % M; prefX[i] += prefX[i-1]; prefX[i] *= tabB[i]; prefX[i] %= M; } int last = n+1; for(int i = n; i >= 1; i--){ if(tabB[i] == 1){ end[i] = last - 1; }else{ last = i; } } for(int i = 0; i < q; i++){ ll x; int l, r; cin >> x >> l >> r; bool flag = true; l++; while(l <= r){ if(tabB[l] == 1){ int k = min(end[l], r); x += prefA[k] - prefA[l-1]; l = k+1; }else{ x = max(x + tabA[l], x * tabB[l]); l++; } if(x >= M){ x %= M; break; } } if(l > r){ cout << x << '\n'; continue; } ll prod = (prefB[r] * pot(prefB[l-1])) % M; x *= prod; x %= M; x += (prefX[r] - (prefX[l-1] * prod) % M + M) % M; x %= M; cout << x << '\n'; } return 0; } |
English