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
#include <bits/stdc++.h>
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using namespace std;
template <class T>
using Ve = vector<T>;
#define ALL(v) (v).begin(), (v).end()
#define pii pair<ll, ll>
#define rep(i, a, b) for(ll i = (a); i <= (b); ++i)
#define per(i, a, b) for(ll i = (a); i >= (b); --i)
#define pb push_back
bool Mbe;
ll read() {
    ll x = 0, f = 1; char ch = getchar();
    while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
    return x * f;
}
void write(ll x) {
    if(x < 0) putchar('-'), x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
const ll N = 5e5 + 9, Mod = 1e9 + 7;
ll n, q, a[N], b[N], nxt[N], nxt2[N], sum[N];
struct F {
    ll k, b;
} tr[N << 2];
F operator * (const F &x, const F &y) {
    return {x.k * y.k % Mod, (y.k * x.b + y.b) % Mod};
}
void Pushup(ll x) {
    tr[x] = tr[x << 1] * tr[x << 1 | 1];
}
void Build(ll x, ll l, ll r) {
    if(l == r) {
        if(b[l] == 1) tr[x] = {1, a[l]};
        else tr[x] = {b[l], 0};
        return ;
    }
    ll mid = (l + r) >> 1;
    Build(x << 1, l, mid), Build(x << 1 | 1, mid + 1, r);
    Pushup(x);
}
F Query(ll x, ll l, ll r, ll ql, ll qr) {
    if(ql <= l && r <= qr) return tr[x];
    ll mid = (l + r) >> 1;
    if(qr <= mid) return Query(x << 1, l, mid, ql, qr);
    if(ql > mid) return Query(x << 1 | 1, mid + 1, r, ql, qr);
    return Query(x << 1, l, mid, ql, qr) * Query(x << 1 | 1, mid + 1, r, ql, qr);
}
bool Med;
int main() {
    cerr << fabs(&Med - &Mbe) / 1048576.0 << "MB\n";
    n = read(), q = read();
    rep(i, 1, n) a[i] = read(), b[i] = read();
    Build(1, 1, n);
    nxt[n + 1] = n + 1, nxt2[n + 1] = n + 1;
    per(i, n, 1) {
        if(b[i] > 1) nxt[i] = i;
        else nxt[i] = nxt[i + 1];
        if(a[i]) nxt2[i] = i;
        else nxt2[i] = nxt2[i + 1];
    }
    rep(i, 1, n) sum[i] = sum[i - 1] + a[i];
    while(q--) {
        ll x = read(), l = read() + 1, r = read();
        if(!x) {
            ll w = nxt2[l];
            if(w > r) {
                puts("0");
                continue;
            }
            l = w;
            x += a[l], ++l;
        }
        while(x <= Mod) {
            ll w = nxt[l];
            if(w > r) {
                x += sum[r] - sum[l - 1];
                l = r + 1;
                break;
            }
            x += sum[w - 1] - sum[l - 1];
            l = w;
            if(x > Mod) break;
            x = max(x + a[l], x * b[l]), ++l;
        }
        x %= Mod;
        if(l > r) {
            write(x), putchar('\n');
            continue ;
        }
        F qu = Query(1, 1, n, l, r);
        write((qu.k * x + qu.b) % Mod), putchar('\n');
    }
    cerr << "\n" << clock() * 1.0 / CLOCKS_PER_SEC * 1000 << "ms\n";
    return 0;
}