#ifdef LOC
#include "debuglib.hpp"
#else
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define deb(...)
#define DBP(...)
#endif
using namespace std;
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define rep(i, b, e) for (int i = (b); i < (e); i++)
#define each(a, x) for (auto& a : (x))
#define all(x) (x).begin(), (x).end()
#define sz(x) int((x).size())
constexpr int MOD = int(1e9) + 7;
ll modPow(ll a, ll e, ll m) {
ll t = 1 % m;
while (e) {
if (e % 2) t = t*a % m;
e /= 2; a = a*a % m;
}
return t;
}
struct Zp {
ll x;
Zp() : x(0) {}
Zp(ll a) : x(a%MOD) { if (x < 0) x += MOD; }
#define OP(c,d) Zp& operator c##=(Zp r) { x = x d; return *this; } Zp operator c(Zp r) const { Zp t = *this; return t c##= r; }
OP(+, +r.x - MOD*(x+r.x >= MOD));
OP(-, -r.x + MOD*(x-r.x < 0));
OP(*, *r.x % MOD);
OP(/, *r.inv().x % MOD);
Zp operator-() const { return Zp()-*this; }
Zp inv() const { return pow(MOD-2); }
Zp pow(ll e) const{ return modPow(x,e,MOD); }
void print() { cerr << x; }
};
int main() {
cin.sync_with_stdio(0); cin.tie(0);
cout << fixed << setprecision(12);
int n, q;
cin >> n >> q;
vector<ll> add(n), mul(n);
rep(i, 0, n) cin >> add[i] >> mul[i];
vector<ll> prefSum(n+1);
vector<Zp> prefA(n+1, 1), prefB(n+1);
vector<int> nextMul(n+1, n);
rep(i, 0, n) {
prefSum[i+1] = prefSum[i] + add[i];
if (mul[i] > 1) {
prefA[i+1] = prefA[i] * mul[i];
prefB[i+1] = prefB[i] * mul[i];
} else {
prefA[i+1] = prefA[i];
prefB[i+1] = prefB[i] + add[i];
}
}
for (int i = n-1; i >= 0; i--) {
nextMul[i] = (mul[i] > 1 ? i : nextMul[i+1]);
}
while (q--) {
ll val;
int pos, end;
cin >> val >> pos >> end;
while (val < MOD && pos < end) {
int nxt = min(nextMul[pos], end);
val += prefSum[nxt] - prefSum[pos];
pos = nxt;
if (val >= MOD || pos >= end) break;
val = max(val + add[pos], val * mul[pos]);
pos++;
}
Zp ans = (Zp(val) - prefB[pos]) / prefA[pos] * prefA[end] + prefB[end];
cout << ans.x << '\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 | #ifdef LOC #include "debuglib.hpp" #else #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define deb(...) #define DBP(...) #endif using namespace std; using ll = long long; using vi = vector<int>; using pii = pair<int, int>; #define pb push_back #define mp make_pair #define x first #define y second #define rep(i, b, e) for (int i = (b); i < (e); i++) #define each(a, x) for (auto& a : (x)) #define all(x) (x).begin(), (x).end() #define sz(x) int((x).size()) constexpr int MOD = int(1e9) + 7; ll modPow(ll a, ll e, ll m) { ll t = 1 % m; while (e) { if (e % 2) t = t*a % m; e /= 2; a = a*a % m; } return t; } struct Zp { ll x; Zp() : x(0) {} Zp(ll a) : x(a%MOD) { if (x < 0) x += MOD; } #define OP(c,d) Zp& operator c##=(Zp r) { x = x d; return *this; } Zp operator c(Zp r) const { Zp t = *this; return t c##= r; } OP(+, +r.x - MOD*(x+r.x >= MOD)); OP(-, -r.x + MOD*(x-r.x < 0)); OP(*, *r.x % MOD); OP(/, *r.inv().x % MOD); Zp operator-() const { return Zp()-*this; } Zp inv() const { return pow(MOD-2); } Zp pow(ll e) const{ return modPow(x,e,MOD); } void print() { cerr << x; } }; int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(12); int n, q; cin >> n >> q; vector<ll> add(n), mul(n); rep(i, 0, n) cin >> add[i] >> mul[i]; vector<ll> prefSum(n+1); vector<Zp> prefA(n+1, 1), prefB(n+1); vector<int> nextMul(n+1, n); rep(i, 0, n) { prefSum[i+1] = prefSum[i] + add[i]; if (mul[i] > 1) { prefA[i+1] = prefA[i] * mul[i]; prefB[i+1] = prefB[i] * mul[i]; } else { prefA[i+1] = prefA[i]; prefB[i+1] = prefB[i] + add[i]; } } for (int i = n-1; i >= 0; i--) { nextMul[i] = (mul[i] > 1 ? i : nextMul[i+1]); } while (q--) { ll val; int pos, end; cin >> val >> pos >> end; while (val < MOD && pos < end) { int nxt = min(nextMul[pos], end); val += prefSum[nxt] - prefSum[pos]; pos = nxt; if (val >= MOD || pos >= end) break; val = max(val + add[pos], val * mul[pos]); pos++; } Zp ans = (Zp(val) - prefB[pos]) / prefA[pos] * prefA[end] + prefB[end]; cout << ans.x << '\n'; } } |
English