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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int mod = 1e9 + 7, nax = 500 * 1000 + 10;
int n, q;
int a[nax], b[nax];
ll prefix_sum[nax];
int nxt[nax], non_zero[nax];
pair<int, int> T[(1 << 21)];

int fastpow(int x, int y) {
    int r = 1;
    while (y) {
        if (y & 1) r = ((ll)r * x) % mod;
        x = ((ll)x * x) % mod;
        y /= 2;
    }
    return r;
}

int R;

pair<int, int> merge(pair<int,int>c, pair<int,int>d) {
   auto [x1,y1] = c;
   auto [x2,y2] = d;
   int x = ((ll)x1 * y2 + x2) % mod;
   int y = ((ll)y1 * y2) % mod;
   return {x, y};
}

pair<int, int> query(int l, int r) {
    l += R, r += R;
    pair<int, int> ansl = T[l], ansr = {0,1};
    if (l != r) ansr = T[r];
    while (l/2 != r/2) {
        if (l%2==0) {
            ansl = merge(ansl, T[l^1]);
        }
        if (r%2==1) {
            ansr = merge(T[r^1], ansr);
        }
        l /= 2;
        r /= 2;
    }
    return merge(ansl, ansr);
}

void solve() {
    cin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i] >> b[i];
    }

    R = 2;
    while (R < n) {
        R *= 2;
    }

    for (int i = 1; i <= R; ++i) {
        int x = 0, y = 1;
        if (i <= n) {
            if (b[i] == 1) {
                x = a[i];
            } else {
                y = b[i];
            }
        }
        T[i + R - 1] = {x, y};
    }
    for (int i = R - 1; i >= 1; --i) {
        T[i] = merge(T[2 * i], T[2*i+1]);
    }
    
    for (int i = 1; i <= n; ++i) {
        prefix_sum[i] = prefix_sum[i - 1];
        if (b[i] == 1) {
            prefix_sum[i] += a[i];
        }
    }

    int last = n + 1;
    int last_non_zero = n + 1;
    for (int i = n; i >= 1; --i) {
        nxt[i] = last;
        non_zero[i] = last_non_zero;
        if (b[i] != 1) {
            last = i;
        }
        if (a[i] != 0) {
            last_non_zero = i;
        }
    }

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

        if (x == 0 && a[l] == 0) {
            l = non_zero[l];
        }

        while (x <= mod && l <= r) {
            if (x + a[l] >= x * b[l]) {
                x += a[l];
            } else {
                x *= b[l];
            }
            int jump = min(r + 1, nxt[l]);
            x += (prefix_sum[jump - 1] - prefix_sum[l]);
            l = jump;
        }
        
        x %= mod;

        pair<int, int> transform = {0, 1};
        if (l <= r) {
            transform = query(l-1, r-1);
        }
        x = ((ll)x * transform.second + transform.first) % mod;
        /*
        while (l <= r) {
            if (b[l] == 1) {
                x = (x + a[l]) % mod;
            } else {
                x = (x * b[l]) % mod;
            }
            l++;
        }
        */
        cout << (x % mod) << "\n";
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
}