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
#include <bits/stdc++.h>
#define MOD 1000000007
#define ls (n<<1)
#define rs ((n<<1)|1)
#define md ((l+r)>>1)
int N,Q,a[500009],b[500009],s1[2000009],s2[2000009],
aa[500009],cl[500009],tt,la[500009];
long long su[500009];
void sv(int& x,int n,int l,int r,int L,int R) {
	if(r<L||R<l||L>R) return;
	if(L<=l&&r<=R) {
		x=(1ll*x*s1[n]+s2[n])%MOD;
		return;
	}
	sv(x,ls,l,md,L,R);
	sv(x,rs,md+1,r,L,R);
}
void bd(int n,int l,int r) {
	if(l==r) {
		if(b[l]==1) s1[n]=1,s2[n]=a[l];
		else s1[n]=b[l],s2[n]=0;
		return;
	}
	bd(ls,l,md),bd(rs,md+1,r);
	s1[n]=1ll*s1[ls]*s1[rs]%MOD;
	s2[n]=(1ll*s2[ls]*s1[rs]+s2[rs])%MOD;
}
signed main(void) {
	scanf("%d %d",&N,&Q);
	for(int i=1;i<=N;i++) {
		scanf("%d %d",&a[i],&b[i]);
		su[i]=su[i-1]+a[i];
		if(b[i]>1) {
			aa[++tt]=i;
		}
		if(a[i]!=0) la[i]=i;
	}
	la[N+1]=N+1;
	for(int i=N;i>=1;i--) {
		if(la[i]==0) la[i]=la[i+1];
	}
	aa[tt+1]=N+1;
	for(int i=1;i<=tt;i++) {
		for(int j=aa[i-1]+1;j<=aa[i];j++)cl[j]=i;
	}
	for(int j=aa[tt]+1;j<=N;j++) cl[j]=tt+1;
	bd(1,1,N);
	while(Q--) {
		int l,r,x;
		scanf("%d %d %d",&x,&l,&r);
		l++;
		if(x==0) {
			int qq=la[l];
			if(qq>r) {
				printf("0\n");
				continue;
			}
			assert(l<=qq);
			l=qq;
			assert(a[l]!=0);
		}
		while(l<=r) {
			int po=aa[cl[l]];
			if(po>r) {
				x=(x+su[r]-su[l-1])%MOD;
				break;
			}
			if(x+su[po-1]-su[l-1]>=MOD) {
				sv(x,1,1,N,l,r);
				break;
			}
			x+=su[po-1]-su[l-1];
			l=po;
			long long ww=std::max(1ll*x*b[l],(long long)x+a[l]);
		//	assert(b[l]>1);
			if(ww>=MOD) {
				x=ww%MOD;
				sv(x,1,1,N,l+1,r);
				break;
			}
			x=ww;
//			assert(x);
			l++;
		}
		printf("%d\n",x);
	}
}