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
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<algorithm>
#include<bits/stdc++.h>
#define pr pair
#define f first
#define s second
#define ll long long
#define mp make_pair
#define pll pr<ll,ll>
#define pii pr<int,int>
#define piii pr<int,pii>
using namespace std;
const ll m=1e9+7;
ll pw(ll a,ll b=m-2)
{
	ll r=1;
	while(b)
	{
		if(b&1) r=r*a%m;
		a=a*a%m;
		b>>=1;
	}
	return r;
}
ll a[500005],b[500005];
int tr[500005];
ll ad[500005];
ll pk[500005],pb[500005];
int main()
{
	ios_base::sync_with_stdio(0);
	int n,q;
	cin>>n>>q;
	for(int i=0;i<n;i++) cin>>b[i]>>a[i];
	tr[n]=n;
	pk[n]=1;
	for(int i=n-1;i>=0;i--) if(a[i]<=1)
	{
		tr[i]=tr[i+1];
		ad[i]=ad[i+1]+b[i];
		pk[i]=pk[i+1];
		pb[i]=(pb[i+1]+pk[i+1]*b[i])%m;
	}
	else
	{
		tr[i]=i;
		pk[i]=pk[i+1]*a[i]%m;
		pb[i]=pb[i+1];
	}
	int l,r;
	ll x;
	while(q--)
	{
		cin>>x>>l>>r;
		while(x<m&&l<r)
		{
			if(tr[l]>r) break;
			if(tr[l]==l)
			{
				x=max(x*a[l],x+b[l]);
				l++;
			}
			else
			{
				x+=ad[l];
				l=tr[l];
			}
		}
		x%=m;
		ll g=pw(pk[r]);
		ll ck=g*pk[l]%m;
		ll cb=(pb[l]+m-pb[r])*g%m;
		x=(x*ck+cb)%m;
		cout<<x<<'\n';
	}
	return 0;
}