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
#include <bits/stdc++.h>
#define FOR(i, a, b) for(int i = (int)a; i <= (int)b; ++i)
#define RFOR(i, a, b) for(int i = (int)a; i >= (int)b; --i)
#define in insert
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
using namespace std;

ll MOD = 1e9 + 7;
const int MAX = 5e5 + 7;
ll mj[MAX], mw[MAX], sm[MAX], minv[MAX];

ll fpow(ll a, ll b) {
    if(b == 0) return 1;
    ll res = fpow(a, b >> 1);
    res *= res; res %= MOD;
    if(b & 1) {
        res *= a;
        res %= MOD;
    }
    return res;
}

ll gc() {
    char x;
    while(true) {
        x = getchar_unlocked();
        if(x >= '0' && x <= '9') break;
    }
    ll num = x - '0';
    while(true) {
        x = getchar_unlocked();
        if(x >= '0' && x <= '9') {
            num *= 10;
            num += (x - '0');
        } else break;
    }
    return num;
}

void pc(ll num) {
    if(num >= 10) pc(num / 10);
    putchar_unlocked('0' + num % 10);
}

void solve() {
    ll n = gc(), q = gc();
    vector<pair<ll, ll>> tab(n + 1);
    mw[0] = 1;
    mj[n + 1] = n + 1;
    FOR(i, 1, n) {
        ll a = gc(), b = gc();
        tab[i] = {a, b};
        sm[i] = sm[i - 1];
        mw[i] = mw[i - 1];
        minv[i] = minv[i - 1];
        if(b <= 1) {
            sm[i] += a;
            ll akt = fpow(mw[i - 1], MOD - 2) * a; akt %= MOD;
            minv[i] += akt; minv[i] %= MOD;
        } else {
            mw[i] *= b;
            mw[i] %= MOD;
        }
    }
    RFOR(i, n, 1) {
        pair<ll, ll> akt = tab[i];
        if(akt.se <= 1) mj[i] = mj[i + 1];
        else mj[i] = i;
    }
    FOR(i, 1, q) {
        ll x = gc(), l = gc(), r = gc();
        ll ind = l + 1;
        while(true) {
            x += (sm[min(mj[ind] - 1, r)] - sm[ind - 1]);
            ind = mj[ind];
            if(x >= MOD) break;
            if(ind > r) break;
            x = max(x + tab[ind].fi, x * tab[ind].se);
            if(x >= MOD) {++ind; break;}
            ++ind;
            if(ind > r) break;
        }
        if(ind > r) {
            x %= MOD;
            pc(x);
            putchar_unlocked('\n');
            continue;
        }
        x %= MOD;
        x *= fpow(mw[ind - 1], MOD - 2); x %= MOD;
        x += (minv[r] - minv[ind - 1] + MOD) % MOD; x %= MOD;
        x *= mw[r]; x %= MOD;
        pc(x);
        putchar_unlocked('\n');
    }
}

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