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
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int mod = 1e9+7, K = 30;

int mul(int a, int b){
    return (a*b)%mod;
}

void add(int &a, int b){
    a += b;
    if (a >= mod) a-=mod;
}

void sub(int &a, int b){
    a -= b;
    if (a < 0) a+=mod;
}

int power(int a, int b){
    if (!b) return 1ll;
    int k = power(a, b/2);
    k = mul(k, k);
    if (b&1) k = mul(k, a);
    return k;
}

void solve() {
    int n, q; cin >> n >> q;
    vector<int>a(n+1), b(n+1), pref(n+1);
    vector<int>nast(n+2, -1), nastniezero(n+2, -1);

    vector<int>A(n+1, 1), B(n+1);// invA(n+1, 1);
    for (int i = 1; i<=n; i++) {
        cin >> a[i] >> b[i];
        pref[i] = pref[i - 1] + a[i];

        A[i] = A[i - 1];
        B[i] = B[i - 1];
        if (b[i] == 1) {
            add(B[i], a[i]);
        } else {
            A[i] = mul(A[i], b[i]);
        }
        // invA[i] = power(A[i], mod-2);
    }
    vector<int>C(n+2), suf(n+2, 1);// invsuf(n+2, 1);
    for (int i = n; i >= 1; i--) {
        C[i] = C[i + 1];
        suf[i] = suf[i + 1];
        if (b[i] == 1) {
            add(C[i], mul(a[i], suf[i]));
        } else {
            suf[i] = mul(suf[i], b[i]);
        }
        // invsuf[i] = power(suf[i], mod - 2);
    }

    for (int i = n; i >= 1; i--){
        nast[i] = nast[i + 1];
        nastniezero[i] = nastniezero[i + 1];
        if (b[i] >= 2) nast[i] = i;
        if (a[i] != 0) nastniezero[i] = i;
    }

    while (q--) {
        int x, l, r; cin >> x >> l >> r;

        int i = l + 1;
        
        if (x == 0) {
            i = nastniezero[i];
            if (i == -1 || i > r) {
                cout << "0\n";
                continue;
            }
        }
        while (i <= r) {
            if (x >= mod) {
                x %= mod;
                x = mul(x, mul(A[r], power(A[i - 1], mod - 2)));
                int inv = power(suf[r + 1], mod - 2);
                int skl = C[i];
                sub(skl, C[r+1]);
                add(x, mul(skl, inv));
                // add(x, mul(C[i], invsuf[r + 1]));
                // sub(x, mul(C[r + 1], invsuf[r + 1]));
                break;
            }
            if (nast[i] == -1 || nast[i] > r) {
                // wszedzie dalej bi = 1
                add(x, pref[r]);
                sub(x, pref[i - 1]);
                break;
            }

            int j = nast[i];
            x += pref[j - 1] - pref[i - 1];
            if (a[j] + x >= b[j] * x) {
                x += a[j];
            } else {
                x *= b[j];
            }
            i = j + 1;
        }

        cout << x % mod << "\n";
    }
}

int32_t main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    solve();

    return 0;
}