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

 
#define ll long long
#define ve vector
#define fi first
#define se second
#define pb push_back
#define all(x) begin(x), end(x)
 
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

template <int MOD>
struct modint {
    int value;
    static const int MOD_value = MOD;

    modint(long long v = 0) { value = v % MOD; if (value < 0) value += MOD;}
    modint(long long a, long long b) : value(0){ *this += a; *this /= b;}

    modint& operator+=(modint const& b) {value += b.value; if (value >= MOD) value -= MOD; return *this;}
    modint& operator-=(modint const& b) {value -= b.value; if (value < 0) value += MOD;return *this;}
    modint& operator*=(modint const& b) {value = (long long)value * b.value % MOD;return *this;}

    friend modint mexp(modint a, long long e) {
        modint res = 1; while (e) { if (e&1) res *= a; a *= a; e >>= 1; }
        return res;
    }
    friend modint inverse(modint a) { return mexp(a, MOD - 2); }

    modint& operator/=(modint const& b) { return *this *= inverse(b); }
    friend modint operator+(modint a, modint const b) { return a += b; }
    friend modint operator-(modint a, modint const b) { return a -= b; }
    friend modint operator-(modint const a) { return 0 - a; }
    friend modint operator*(modint a, modint const b) { return a *= b; }
    friend modint operator/(modint a, modint const b) { return a /= b; }
    friend std::ostream& operator<<(std::ostream& os, modint const& a) {return os << a.value;}
    friend bool operator==(modint const& a, modint const& b) {return a.value == b.value;}
    friend bool operator!=(modint const& a, modint const& b) {return a.value != b.value;}
};
typedef modint<1'000'000'007> mint; 

void solve(){
    int n, q;
    cin >> n >> q;
    ve<pll> v(n);
    for(auto& i : v)
        cin >> i.fi >> i.se;
    ve<mint> prod(n+1, 1);
    ve<ll> sum(n+1, 0);
    ve<mint> sum2(n+1, 0);
    for(int i = 1; i <= n; i++){
        prod[i] = prod[i-1]*v[i-1].se;
        sum[i] = sum[i-1];
        if(v[i-1].se == 1)
            sum[i] += v[i-1].fi;
    }
    for(int i = 1; i <= n; i++){
        sum2[i] = sum2[i-1];
        if(v[i-1].se == 1)
            sum2[i] += (prod[n]/prod[i])*v[i-1].fi;
    }
    ve<int> nxt(n, n);
    for(int i = n - 2; i >= 0; i--){
        if(v[i+1].se == 1)
            nxt[i] = nxt[i+1];
        else nxt[i] = i + 1;
    }
    while(q--){
        int l, r;
        ll res = 0;
        cin >> res >> l >> r;
        r--;
        while(l < n && res < 1e9+100 && nxt[l] <= r+1){
            res = max(res*v[l].se, res+v[l].fi);
            res += sum[nxt[l]] - sum[l+1];
            l = nxt[l];
        }
        if(l <= r){
            res = max(res*v[l].se, res+v[l].fi);
            l++;
        }
        mint ans = (prod[r+1]/prod[l])*res;
        ans += (sum2[r+1]-sum2[l])/(prod[n]/prod[r+1]);
        cout << ans << "\n";
    }
}
 
signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int T = 1;
    // cin >> T;
    while(T--) solve();
}