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
#include <cstdio>
#include <vector>
using std::vector;

const int M = 501'013;
const int Q = 1'000'000'007;

int dol(long long x) {
  if (x >= Q) return x%Q + Q;
  return x;
}

int krok2(long long x, int a, int b) {
  if (x + a < x * b) {
    return dol(x * b);
  }
  return dol(x+a);
}

long long odw(int x) {
  x %= Q;
  int n = Q-2;
  int ret = 1;
  while(n) {
    if (n % 2) ret = ((long long)ret) * x % Q;
    x = ((long long)x) * x % Q;
    n /= 2;
  }
  return ret;
}

int n, a[M], b[M];
int nda[M], n2b[M];
long long sa[M], ilb[M], sab[M];

int all(int x, int l, int r) {
  int ret = (x * ilb[r] % Q) * odw(ilb[l]) % Q;
  ret = (ret + ((sab[l]-sab[r]+Q) * odw(ilb[n]) % Q) * ilb[r]) % Q;
  return (ret % Q + Q) % Q;
}

int go(int x, int l, int r) {
  //printf("  :: %d %d %d\n", x, l, r);
  if (x == 0) l = nda[l];
  if (l >= r) return x;
  if (x == 0) return go(a[l], l+1, r);
  if (x >= Q) return all(x, l, r);
  if (b[l] > 1) {
    return go(krok2(x, a[l], b[l]), l+1, r);
  }
  int s = std::min(r, n2b[l]);
  return go(dol(sa[s] - sa[l] + x), s, r);
}

int main() {
  int q;
  scanf("%d %d", &n, &q);
  sa[0] = 0;
  ilb[0] = 1;
  for (int i = 0; i < n; i++) {
    scanf("%d %d", &a[i], &b[i]);
    sa[i+1] = sa[i] + a[i];
    ilb[i+1] = ilb[i] * b[i] % Q;
  }
  nda[n] = n;
  n2b[n] = n;
  sab[n] = 0;
  long long ib = 1;
  for (int i = n-1; i >= 0; i--) {
    sab[i] = sab[i+1];
    if (b[i] == 1) sab[i] = (sab[i] + a[i] * ib) % Q;
    ib = (ib * b[i]) % Q;
    if (a[i] > 0) nda[i] = i;
    else nda[i] = nda[i+1];
    if (b[i] >= 2) n2b[i] = i;
    else n2b[i] = n2b[i+1];
  }
  for (int i = 0; i < q; i++) {
    int l,r,x;
    scanf("%d %d %d", &x,&l,&r);
    printf("%d\n", go(x, l, r) % Q);
  }
  return 0;
}