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
#include<iostream>
#include<vector>
int n,q,a,b,l,r;
long long x;
long long sumsuf[500000];
int nextmul[500000];
int nextadd[500000];
long long drzemul[1100000];
long long drzeadd[1100000];
const int prze=(1<<19);
const long long mod = 1000LL*1000LL*1000LL+7LL;
int main(){
	std::ios_base::sync_with_stdio(false);
	std::cin>>n>>q;
	std::vector<int> ad,mu;
	for(int i=0;i<n;i++){
		std::cin>>a>>b;
		ad.emplace_back(a);
		mu.emplace_back(b);
	}
	int pozmu=n;
	int pozadd=n;
	long long sum=0;
	for(int i=n-1;i>=0;i--){
		nextmul[i]=pozmu;
		if(ad[i]>0)
			pozadd=i;
		nextadd[i]=pozadd;
		if(mu[i]>1){
			pozmu=i;
			sum=0;
		}else{
			sum+=ad[i];
		}
		sumsuf[i]=sum;
	}
	for(int i=0;i<n;i++)
		if(mu[i]>1){
			drzemul[i+prze]=mu[i];
		}else{
			drzeadd[i+prze]=ad[i];
			drzemul[i+prze]=1;
		}
	for(int i=prze-1;i>=1;i--){
		drzeadd[i]=(drzeadd[i*2]*drzemul[i*2+1]+drzeadd[i*2+1])%mod;
		drzemul[i]=(drzemul[i*2]*drzemul[i*2+1])%mod;
	}
	for(int i=0;i<q;i++){
		std::cin>>x>>l>>r;
		r--;
		if(x==0)
			l=nextadd[l];
		while(x<mod && l<=r){
			//std::cout<<"lr "<<l<<" "<<r<<std::endl;
			if(x+ad[l]>x*mu[l]){
				x+=ad[l];
			}else
				x*=mu[l];
			if(nextmul[l]>r){
				l++;
				break;
			}
			if(l<r)
				x+=sumsuf[l+1];
			l=nextmul[l];
			//std::cout<<x<<" "<<l<<std::endl;
		}
		x%=mod;
		//std::cout<<x<<std::endl;
		int lw=l+prze;
		int rw=r+prze;
		std::vector<int> poz;
		//std::cout<<l<<" "<<r<<std::endl;
		while(lw<rw){
			//std::cout<<"LL "<<lw<<" "<<rw<<std::endl;
			if(lw%2){
				x=(x*drzemul[lw]+drzeadd[lw])%mod;
				lw++;
			}
			if(rw%2==0){
				poz.emplace_back(rw);
				rw--;
				}
			lw/=2;
			rw/=2;
			//std::cout<<x<<std::endl;
		}
		if(lw==rw)
			poz.emplace_back(lw);
		for(int i=poz.size()-1;i>=0;i--){
			x=(x*drzemul[poz[i]]+drzeadd[poz[i]])%mod;
			//std::cout<<drzemul[poz[i]]<<" "<<drzeadd[poz[i]]<<std::endl;
		}
		std::cout<<x<<std::endl;
	}
}