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
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MOD = 1e9 + 7;

struct pfsum {
    vector<int> a;
    pfsum(vector<int> aa) : a(aa) {
        for (int i = 1; i < (int)a.size(); i++) {
            a[i] += a[i - 1];
        }
    }
    int operator()(int x, int y) {
        return a[y] - a[x - 1];
    }
};

struct nxtbig {
    vector<int> b, nxt;
    nxtbig(vector<int> b) : b(b) {
        nxt.resize(b.size());
        int cur = b.size();
        for (int i = b.size() - 1; i >= 0; i--) {
            if (b[i] > 1)
                cur = i;
            nxt[i] = cur;
        }
    }
    int operator[](int i) {
        return nxt[i];
    }
};

struct segtree {
    int L = 1;
    vector<int> add, mul;
    segtree(const vector<int> &a, const vector<int> &b) {
        int n = a.size();
        while (L < n) L <<= 1;
        add.resize(L * 2);
        mul.resize(L * 2, 1);
        for (int i = 0; i < n; i++) {
            if (b[i] <= 1) {
                add[L + i] = a[i];
                mul[L + i] = 1;
            }
            else {
                add[L + i] = 0;
                mul[L + i] = b[i];
            }
        }
        for (int i = L - 1; i > 0; i--) {
            int l = i << 1, p = l + 1;
            add[i] = (add[l] * mul[p] + add[p]) % MOD;
            mul[i] = (mul[l] * mul[p]) % MOD;
        }
    }

    void query(int w, int p, int k, int x, int y, int &a, int &b) {
        if (x <= p && k <= y) {
            a = (a * mul[w] + add[w]) % MOD;
            b = (b * mul[w]) % MOD;
            return;
        }
        int sr = (p + k) / 2;
        if (x <= sr) query(w << 1, p, sr, x, y, a, b);
        if (y > sr)  query(w << 1 | 1, sr + 1, k, x, y, a, b);
    }
};

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, q; cin >> n >> q;
    vector<int>a(n + 1), b(n + 1);
    a[0] = 0; b[0] = 1;
    for (int i = 1; i <= n; i++)
        cin >> a[i] >> b[i];
    
    pfsum sum(a);
    nxtbig nxt(b);
    segtree st(a, b);

    for (int i = 0; i < q; i++) {
        int x, l, r; cin >> x >> l >> r;
        l++;
        while (l <= r && x < MOD) {
            // cout << " " << i << " " << x << " " << l << " " << nxt[l] << endl;
            int nx = min(nxt[l], r);
            x += sum(l, nx - 1);
            if (x > MOD) {
                l = nx;
                break;
            }
            // cout << " " << i << " " << x << " " << l << " " << nxt[l] << endl;
            if (x + a[nx] < x * b[nx])
                x *= b[nx];
            else
                x += a[nx];
            l = nx + 1;
        }
        x %= MOD;
        // cout << x << " " << l << endl;
        if (l <= r) {
            int mul = 1;
            st.query(1, 0, st.L - 1, l, r, x, mul);
            // cout << "AM " << mul << endl;
        }
        cout << x << "\n";
    }

    return 0;
}