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
#include<bits/stdc++.h>
using namespace std;
const long long mod=(int)1e9+7;
vector<long long>A,B;
vector<long long>aa,bb;
vector<long long>Suma;
vector<long long>Iloczyn;
vector<int>Nastepny,Nastepny2;
long long QuickPow(long long a, long long b)
{
    long long wyn=1;
    while(b>0)
    {
        if(b%2==1){wyn=(wyn*a)%mod;}
        a=(a*a)%mod;
        b>>=1;
    }
    return wyn;
}
pair<long long,long long>ObliczZiomow(long long a1, long long b1, long long a3, long long b3)
{
    long long a2,b2;
    a2=(a3*QuickPow(a1,mod-2))%mod;
    b2=(b3-(a2*b1)%mod+mod)%mod;
    return {a2,b2};
}
int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,q;
    cin>>n>>q;
    A.resize(n+1);
    B.resize(n+1);
    aa.resize(n+1);
    bb.resize(n+1);
    Suma.resize(n+1);
    Iloczyn.resize(n+1);
    Nastepny.resize(n+1);
    Nastepny2.resize(n+1);
    Iloczyn[0]=1;
    aa[0]=1;
    bb[0]=0;
    for(int i=1;i<=n;i++)
    {
        cin>>A[i]>>B[i];
        Suma[i]=Suma[i-1]+A[i];
        Iloczyn[i]=(Iloczyn[i-1]*B[i])%mod;
        if(B[i]>1)
        {
            aa[i]=(aa[i-1]*B[i])%mod;
            bb[i]=(bb[i-1]*B[i])%mod;
        }
        else
        {
            aa[i]=aa[i-1];
            bb[i]=(bb[i-1]+A[i])%mod;
        }
    }
    Nastepny[n]=n;
    Nastepny2[n]=n;
    for(int i=n-1;i>=1;i--)
    {
        if(B[i]>1){Nastepny[i]=i;}
        else{Nastepny[i]=Nastepny[i+1];}
        if(A[i]>0){Nastepny2[i]=i;}
        else{Nastepny2[i]=Nastepny2[i+1];}
    }
    for(int i=1;i<=q;i++)
    {
        long long x;
        int l,p;
        cin>>x>>l>>p;
        l++;
        if(x==0)
        {
            l=Nastepny2[l];
            if(l>p){cout<<0<<'\n';continue;}
            x=A[l];
            l++;
        }
        while(l<=p)
        {
            int l2=min(p,Nastepny[l]);
            x+=Suma[l2-1]-Suma[l-1];
            __int128 temp=max((__int128)x*B[l2],(__int128)x+A[l2]);
            l=l2+1;
            if(temp >= mod){x=(long long)(temp%(__int128)mod);break;}
            x=temp;
        }
        if(l<=p)
        {
            long long a2,b2;
            tie(a2,b2) = ObliczZiomow(aa[l-1],bb[l-1],aa[p],bb[p]);
            x=(x*a2+b2)%mod;
        }
        cout<<x<<'\n';
    }
    return 0;
}