#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;
}
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; } |
English