#include <bits/stdc++.h>
#define FOR(i, a, b) for(int i = (int)a; i <= (int)b; ++i)
#define RFOR(i, a, b) for(int i = (int)a; i >= (int)b; --i)
#define in insert
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
using namespace std;
ll MOD = 1e9 + 7;
const int MAX = 5e5 + 7;
ll mj[MAX], mw[MAX], sm[MAX], minv[MAX];
ll fpow(ll a, ll b) {
if(b == 0) return 1;
ll res = fpow(a, b >> 1);
res *= res; res %= MOD;
if(b & 1) {
res *= a;
res %= MOD;
}
return res;
}
ll gc() {
char x;
while(true) {
x = getchar_unlocked();
if(x >= '0' && x <= '9') break;
}
ll num = x - '0';
while(true) {
x = getchar_unlocked();
if(x >= '0' && x <= '9') {
num *= 10;
num += (x - '0');
} else break;
}
return num;
}
void pc(ll num) {
if(num >= 10) pc(num / 10);
putchar_unlocked('0' + num % 10);
}
void solve() {
ll n = gc(), q = gc();
vector<pair<ll, ll>> tab(n + 1);
mw[0] = 1;
mj[n + 1] = n + 1;
FOR(i, 1, n) {
ll a = gc(), b = gc();
tab[i] = {a, b};
sm[i] = sm[i - 1];
mw[i] = mw[i - 1];
minv[i] = minv[i - 1];
if(b <= 1) {
sm[i] += a;
ll akt = fpow(mw[i - 1], MOD - 2) * a; akt %= MOD;
minv[i] += akt; minv[i] %= MOD;
} else {
mw[i] *= b;
mw[i] %= MOD;
}
}
RFOR(i, n, 1) {
pair<ll, ll> akt = tab[i];
if(akt.se <= 1) mj[i] = mj[i + 1];
else mj[i] = i;
}
FOR(i, 1, q) {
ll x = gc(), l = gc(), r = gc();
ll ind = l + 1;
while(true) {
x += (sm[min(mj[ind] - 1, r)] - sm[ind - 1]);
ind = mj[ind];
if(x >= MOD) break;
if(ind > r) break;
x = max(x + tab[ind].fi, x * tab[ind].se);
if(x >= MOD) {++ind; break;}
++ind;
if(ind > r) break;
}
if(ind > r) {
x %= MOD;
pc(x);
putchar_unlocked('\n');
continue;
}
x %= MOD;
x *= fpow(mw[ind - 1], MOD - 2); x %= MOD;
x += (minv[r] - minv[ind - 1] + MOD) % MOD; x %= MOD;
x *= mw[r]; x %= MOD;
pc(x);
putchar_unlocked('\n');
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.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 | #include <bits/stdc++.h> #define FOR(i, a, b) for(int i = (int)a; i <= (int)b; ++i) #define RFOR(i, a, b) for(int i = (int)a; i >= (int)b; --i) #define in insert #define pb push_back #define fi first #define se second #define ll long long #define ull unsigned long long using namespace std; ll MOD = 1e9 + 7; const int MAX = 5e5 + 7; ll mj[MAX], mw[MAX], sm[MAX], minv[MAX]; ll fpow(ll a, ll b) { if(b == 0) return 1; ll res = fpow(a, b >> 1); res *= res; res %= MOD; if(b & 1) { res *= a; res %= MOD; } return res; } ll gc() { char x; while(true) { x = getchar_unlocked(); if(x >= '0' && x <= '9') break; } ll num = x - '0'; while(true) { x = getchar_unlocked(); if(x >= '0' && x <= '9') { num *= 10; num += (x - '0'); } else break; } return num; } void pc(ll num) { if(num >= 10) pc(num / 10); putchar_unlocked('0' + num % 10); } void solve() { ll n = gc(), q = gc(); vector<pair<ll, ll>> tab(n + 1); mw[0] = 1; mj[n + 1] = n + 1; FOR(i, 1, n) { ll a = gc(), b = gc(); tab[i] = {a, b}; sm[i] = sm[i - 1]; mw[i] = mw[i - 1]; minv[i] = minv[i - 1]; if(b <= 1) { sm[i] += a; ll akt = fpow(mw[i - 1], MOD - 2) * a; akt %= MOD; minv[i] += akt; minv[i] %= MOD; } else { mw[i] *= b; mw[i] %= MOD; } } RFOR(i, n, 1) { pair<ll, ll> akt = tab[i]; if(akt.se <= 1) mj[i] = mj[i + 1]; else mj[i] = i; } FOR(i, 1, q) { ll x = gc(), l = gc(), r = gc(); ll ind = l + 1; while(true) { x += (sm[min(mj[ind] - 1, r)] - sm[ind - 1]); ind = mj[ind]; if(x >= MOD) break; if(ind > r) break; x = max(x + tab[ind].fi, x * tab[ind].se); if(x >= MOD) {++ind; break;} ++ind; if(ind > r) break; } if(ind > r) { x %= MOD; pc(x); putchar_unlocked('\n'); continue; } x %= MOD; x *= fpow(mw[ind - 1], MOD - 2); x %= MOD; x += (minv[r] - minv[ind - 1] + MOD) % MOD; x %= MOD; x *= mw[r]; x %= MOD; pc(x); putchar_unlocked('\n'); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; } |
English