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;
}