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
#include <iostream>
#include <cstdint>
constexpr auto max_n = 500000;
constexpr auto modulo = 1000000007;

int main() {
    int n, q;
    (void)scanf("%d", &n);
    (void)scanf("%d", &q);
    uint32_t a[max_n], b[max_n];
	for (int i = 0; i < n; ++i) {
        (void)scanf("%d %d", &a[i], &b[i]);
    }
    uint32_t x, l, r;
    uint64_t result;
    bool overflow;
	for (int i = 0; i < q; ++i) {
        (void)scanf("%d %d %d", &x, &l, &r);
        overflow = 0;
        for (int j = l; j < r; ++j) {
            if(overflow){
                if(b[j] > 1){
                    x = (uint32_t)(((uint64_t)x * (uint64_t)b[j]) % modulo);
                }
                else{
                    x = (uint32_t)(((uint64_t)x + (uint64_t)a[j]) % modulo);
                }
            }
            else{
                result = std::max((uint64_t)x + (uint64_t)a[j], (uint64_t)x * (uint64_t)b[j]);
                overflow = result >= modulo;
                x = (uint32_t)(result % modulo);
            }
            
        }
        printf("%d\n", x);
        fflush(stdout);
    }
    return 0;
}