#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9 + 7;
int mul(int a, int b)
{
return (a * b) % MOD;
}
int add(int a, int b)
{
a += b;
if (a >= MOD) a -= MOD;
if (a < 0) a += MOD;
return a;
}
int licz(int pod, int wyk)
{
int wyn = 1;
pod %= MOD;
while (wyk > 0) {
if (wyk & 1) wyn = mul(wyn, pod);
pod = mul(pod, pod);
wyk >>= 1;
}
return wyn;
}
int odw(int x)
{
return licz(x, MOD - 2);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, q;
cin >> n >> q;
vector<int> a(n + 1), b(n + 1);
vector<int> mnoz(n + 1, 1);
vector<int> dod(n + 1, 0);
vector<int> summ(n + 1, 0);
vector<int> nast(n + 2, n + 1);
for (int i = 1; i <= n; i++){
cin >> a[i] >> b[i];
summ[i] = summ[i - 1] + a[i];
if (b[i] == 1){
mnoz[i] = mnoz[i - 1];
dod[i] = add(dod[i - 1], a[i]);
}else{
mnoz[i] = mul(mnoz[i - 1], b[i]);
dod[i] = mul(dod[i - 1], b[i]);
}
}
int last_m = n+1;
for (int i = n; i >= 1; i--){
if (b[i] > 1)
last_m = i;
nast[i] = last_m;
}
while (q--){
int x, l, r;
cin >> x >> l >> r;
l++;
while (l <= r){
int naste = nast[l];
if (naste > r){
x %= MOD;
int M = mul(mnoz[r], odw(mnoz[l - 1]));
x = add(mul(x, M), add(dod[r], -mul(dod[l - 1], M)));
break;
}
int suma_a = summ[naste - 1] - summ[l - 1];
if (x + suma_a >= MOD){
x %= MOD;
int M = mul(mnoz[r], odw(mnoz[l - 1]));
int A = add(dod[r], -mul(dod[l - 1], M));
x = add(mul(x, M), A);
break;
}
x += suma_a;
x = max(x + a[naste], x * b[naste]);
l = naste + 1;
}
cout << x % MOD << "\n";
}
}
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 | #include <bits/stdc++.h> using namespace std; #define int long long const int MOD = 1e9 + 7; int mul(int a, int b) { return (a * b) % MOD; } int add(int a, int b) { a += b; if (a >= MOD) a -= MOD; if (a < 0) a += MOD; return a; } int licz(int pod, int wyk) { int wyn = 1; pod %= MOD; while (wyk > 0) { if (wyk & 1) wyn = mul(wyn, pod); pod = mul(pod, pod); wyk >>= 1; } return wyn; } int odw(int x) { return licz(x, MOD - 2); } signed main() { ios::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; vector<int> a(n + 1), b(n + 1); vector<int> mnoz(n + 1, 1); vector<int> dod(n + 1, 0); vector<int> summ(n + 1, 0); vector<int> nast(n + 2, n + 1); for (int i = 1; i <= n; i++){ cin >> a[i] >> b[i]; summ[i] = summ[i - 1] + a[i]; if (b[i] == 1){ mnoz[i] = mnoz[i - 1]; dod[i] = add(dod[i - 1], a[i]); }else{ mnoz[i] = mul(mnoz[i - 1], b[i]); dod[i] = mul(dod[i - 1], b[i]); } } int last_m = n+1; for (int i = n; i >= 1; i--){ if (b[i] > 1) last_m = i; nast[i] = last_m; } while (q--){ int x, l, r; cin >> x >> l >> r; l++; while (l <= r){ int naste = nast[l]; if (naste > r){ x %= MOD; int M = mul(mnoz[r], odw(mnoz[l - 1])); x = add(mul(x, M), add(dod[r], -mul(dod[l - 1], M))); break; } int suma_a = summ[naste - 1] - summ[l - 1]; if (x + suma_a >= MOD){ x %= MOD; int M = mul(mnoz[r], odw(mnoz[l - 1])); int A = add(dod[r], -mul(dod[l - 1], M)); x = add(mul(x, M), A); break; } x += suma_a; x = max(x + a[naste], x * b[naste]); l = naste + 1; } cout << x % MOD << "\n"; } } |
English