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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;

const int N = 5e5 + 4;
const ll MOD = 1e9 + 7;
pll tab[N];
ll prefSum[N];
ll prefMult[N];
ll multSum[N];
int firstMultToR[N];

ll inv(ll x, ll a = MOD - 2){
    if(a == 0) return 1;
    ll t = inv(x, a / 2);
    return ((a % 2) ? ((t * t) % MOD) * x : t * t) % MOD;
}

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    int n, q;
    cin >> n >> q;
    prefMult[0] = 1;
    for(int i = 1 ; i <= n ; i++){
        cin >> tab[i].first >> tab[i].second;
        prefSum[i] = prefSum[i - 1] + tab[i].first;
        prefMult[i] = (prefMult[i - 1] * tab[i].second) % MOD;
        if(tab[i].second == 1){
            multSum[i] = (multSum[i - 1] + tab[i].first) % MOD;
        }else{
            multSum[i] = (multSum[i - 1] * tab[i].second) % MOD;
        }
    }
    int idx = n + 1;
    for(int i = n ; i >= 1 ; i--){
        firstMultToR[i] = idx;
        if(tab[i].second != 1) idx = i; 
    }
    while(q--){
        int x, l, r;
        cin >> x >> l >> r;
        ll ans = x;
        l++;
        while(ans < MOD){
            if(ans + tab[l].first > ans * tab[l].second){
                ans += tab[l].first;
            }else{
                ans *= tab[l].second;
            }
            idx = firstMultToR[l];
            if(r < idx){
                ans += prefSum[r] - prefSum[l];
                l = r + 1;
                break;
            }
            ans += prefSum[idx - 1] - prefSum[l];
            l = idx;
        }
        ans %= MOD;
        if(l <= r){
            ll multLR = (prefMult[r] * inv(prefMult[l - 1])) % MOD;
            ans = (ans * multLR) % MOD;
            ans += multSum[r] - ((multSum[l - 1] * multLR) % MOD);
            if(ans < 0) ans += MOD;
            else ans %= MOD;
        }
        cout << ans << '\n';
    }
}