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
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;

int main(){
    int n, q;
    cin >> n >> q;
    vector<array<long long, 2>> tab(n);
    long long prefs[n], nextj[n];
    vector<vector<pair<long long, long long>>> dp(20, vector<pair<long long, long long>>(n));
    for(int i = 0; i < n; i++){
        cin >> tab[i][0] >> tab[i][1];
        prefs[i] = tab[i][0] + (i > 0 ? prefs[i-1] : 0);
    }


    for(int i = n-1; i >= 0; i--){
        nextj[i] = i;
        if(i < n-1 && tab[i][1] == 1 && tab[i+1][1] == 1) nextj[i] = nextj[i+1];

        if(tab[i][1] == 1) dp[0][i] = {1, tab[i][0]};
        else dp[0][i] = {tab[i][1], 0}; 
    }

    int d = 1;
    for(int l = 1; l < 20; l++){
        d*=2;
        for(int i = 0; i < n; i++){
            if(i+d-1 >= n) continue;

            dp[l][i] = {dp[l-1][i].first * dp[l-1][i+(d/2)].first, (dp[l-1][i].second * dp[l-1][i+(d/2)].first)%mod + dp[l-1][i+(d/2)].second};
            dp[l][i] = {dp[l][i].first%mod, dp[l][i].second%mod};
        }
    }

    for(int i = 0; i < q; i++){
        long long x, l, r;
        cin >> x >> l >> r;

        for(int j = l; x < mod && j < r; j++){
            if(tab[j][1] == 1){
                if(j == 0) x += prefs[min(r-1, nextj[j])];
                else x += prefs[min(r-1, nextj[j])]-prefs[j-1];
                j = min(r-1, nextj[j]);
            }else{
                x = max(x*tab[j][1], x+tab[j][0]);
            }
            l = j;
        }
        x = x%mod;

        int j = l+1, p = 19;
        d = 1 << 19;
        while(j < r){
            if(j+d-1 >= r){
                d/=2;
                p--;
            }else{
                x = ((x*dp[p][j].first)%mod + dp[p][j].second)%mod;
                j += d;
            }
        }
        cout << x << endl;

    }

}