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
#include <bits/stdc++.h>
using namespace std;
const int MOD=1000000007;
struct fregus 
{
    long long d;    
    long long c;   
};

int n,q;
vector<long long> a,b,pref;
vector<int> frongus;
vector<fregus> tree;
fregus wylej(const fregus& L, const fregus& R) 
{
    return 
    {
        (L.d*R.d) % MOD,
        (R.d*L.c+R.c) % MOD
    };
}
void build(int current, int l, int r) 
{
    if (l==r) 
    {
        if (b[l]>1) tree[current]={b[l] % MOD,0};
        else tree[current]={1,a[l]%MOD};
        return;
    }
    int mid=(l+r)/2;
    build(2*current,l,mid);
    build(2*current+1,mid+1,r);
    tree[current]=wylej(tree[2*current],tree[2*current+1]);
}
fregus query(int current,int l,int r,int ql,int qr) 
{
    if (l==ql&&r==qr) return tree[current];
    int mid=(l+r)/2;
    if (qr<=mid) return query(2*current,l,mid,ql,qr);
    if (ql>mid) return query(2*current+1,mid+1,r,ql,qr);
    return wylej(query(2*current,l,mid,ql,mid),
                 query(2*current+1,mid+1,r,mid+1,qr));
}
int main() 
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    a.assign(n+1,0);
    b.assign(n+1,0);
    pref.assign(n+1,0);
    frongus.assign(n+2,n+1);
    for (int i=1; i<=n; i++) {
        cin>>a[i]>>b[i];
        pref[i]=pref[i-1]+a[i];
    }
    for (int i=n; i>=1; i--) 
    {
        if(b[i]>1)
        {
            frongus[i]=i;
        }
        else
        {
            frongus[i]=frongus[i+1];
        }
    }
    tree.resize(4*n+1);
    build(1,1,n);
    while (q--) 
    {
        long long x;
        int l,r;
        cin>>x>>l>>r;
        int curr=l+1;
        while (curr<=r&&x<MOD) 
        {
            int nxt=frongus[curr];
            if (nxt>r) 
            {
                x+=pref[r]-pref[curr-1];
                curr=r+1;
                break;
            }
            x+=pref[nxt-1]-pref[curr-1];
            if (x>=MOD) 
            {
                curr=nxt;
                break;
            }
            x=max(x+a[nxt],x*b[nxt]);
            curr=nxt+1;
        }
        if (curr<=r) 
        {
            fregus res=query(1, 1, n, curr, r);
            x =(res.d*(x % MOD)+res.c)% MOD;
        }
        cout <<x%MOD<<"\n";
    }
}