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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <bits/stdc++.h>
using namespace std;

typedef long long int lli;

const lli MOD = 1000000007;
const int MAXN = 500005;

lli t[MAXN][2];
lli nextp[MAXN];

lli prs[MAXN];
lli trans[MAXN][2];

lli pow(lli a, lli n) {
	if (n == 0)
		return 1LL;
	if (n%2 == 0) {
		lli p = pow(a, n/2);
		return (p*p)%MOD;
	}
	else {
		return (a*pow(a, n-1))%MOD;
	}
}

lli inv(lli a) {
	return pow(a, MOD-2);
}

lli sumi(lli l, lli r) {
	return prs[r-1] - prs[l-1];
}

// pair<lli, lli> walk(lli l, lli r) {
// 	//TODO
// 	return {0, 0};
// }

lli safe_mod(lli a) {
	a = a%MOD;
	
	if (a < 0)
		a += MOD;
	
	return a;
}

lli finalize(lli x, lli l, lli r) {
	lli y = (safe_mod(x - trans[l][0]) * inv(trans[l][1])) % MOD;
	return (y * trans[r][1] + trans[r][0]) % MOD;
}

int main() {
	int n, q;
	scanf("%d%d", &n, &q);
	
	for (int i=1; i<=n; i++) {
		scanf("%lld%lld", &t[i][0], &t[i][1]);
		prs[i] = (prs[i-1] + t[i][0]);
	}
	
	nextp[n+1] = n+1;
	nextp[n] = n+1;
	
	trans[0][0] = 0;
	trans[0][1] = 1;
	
	for (int i=1; i<=n; i++) {
		if (t[i][1] == 1) {
			trans[i][0] = (trans[i-1][0] + t[i][0]) % MOD;
			trans[i][1] = trans[i-1][1];
		}
		else {
			trans[i][0] = (trans[i-1][0] * t[i][1]) % MOD;
			trans[i][1] = (trans[i-1][1] * t[i][1]) % MOD;
		}
	}
	
	for (int i=n-1; i>=0; i--) {
		if (t[i+1][1] == 1) {
			nextp[i] = nextp[i+1];
		}
		else {
			nextp[i] = i+1;
		}
	}
	
	for (int i=0; i<q; i++) {
		lli x, l, r;
		scanf("%lld%lld%lld", &x, &l, &r);
		
		while (true) {
			if (l >= r)
				break;
			
			int p = nextp[l];
			if (p > r) {
				x = (x + sumi(l+1, r+1))%MOD;
				break;
			}
			
			x += sumi(l+1, p);
			
			if (x >= MOD) {
				x = finalize(x%MOD, p-1, r);
				break;
			}
			
			x = max(x + t[p][0], x*t[p][1]);
			
			if (x >= MOD) {
				x = finalize(x%MOD, p, r);
				break;
			}
			
			l = p;
		}
		
		printf("%lld\n", x);
	}
	
	return 0;
}