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
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;
constexpr long long mod = 1e9 + 7;

long long pw(long long a, long long b) {
   long long mult = a;
   while (b >= 1) {
      if (b & 1) a = (a * mult) % mod;
      mult = (mult * mult) % mod;
      b /= 2;
   }
   return a;
}

long long inv(long long a) {
   return pw(a, mod - 3);
}

long long dv(long long a, long long b) {
   return (a * inv(b)) % mod;
};

int main() {
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);

   int n, q;
   cin >> n >> q;

   vector<pair<long long, long long>> opt(n);
   vector<long long> pre(n + 1), prem(n + 1), prem2(n + 1), pres(n + 1);
   vector<int> nxt(n);
   pre[0] = 1; prem[0] = 1; prem2[n] = 1;

   for (int i = 0; i < n; i++) {
      long long a, b;
      cin >> a >> b;
      opt[i] = {a, b};
      pre[i + 1] = pre[i] + a;
      prem[i + 1] = (prem[i] * b) % mod;
   }

   for (int i = n - 1; i >= 0; i--) {
      prem2[i] = (prem2[i + 1] * opt[i].second) % mod;
   }

   for (int i = 0; i < n; i++) {
      pres[i + 1] = pres[i];
      if (opt[i].second == 1) pres[i + 1] += opt[i].first * prem2[i];
      pres[i + 1] %= mod;
   }

   {
      int p = n + 1;
      for (int i = n - 1; i >= 0; i--) {
         nxt[i] = p;
         if (opt[i].second > 1) p = i;
      }
   }

   // for (int i = 0; i <= n; i++) {
   //    cerr << pres[i] << ' ';
   // }
   // cerr << '\n';

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

      int cur = l;
      while (x < 1e9) {
         int t = nxt[cur];
         if (t > r) break;
         bool b = false;
         x = max(x + opt[cur].first, x * opt[cur].second);
         if (x >= 1e9) b = true;
         x %= mod;
         x = (x + (pre[t] - pre[cur + 1])) % mod;
         cur = t;
         if (b) break;
      }

      if (r != cur) {
         long long mult = dv(prem[r], prem[cur]);
         x = (x * mult) % mod;
         long long add = dv((pres[r] - pres[cur] + mod) % mod, prem2[r]);
         x = (x + add) % mod;
         // cerr << prem[r] << ' ' << prem[cur] << ' ' << mult << '\n';
         // cerr << x << ' ' << add << ' ' << mult << '\n';
      }

      cout << x << '\n';
   }

   return 0;
}