#include <cstdio>
#include <cstdint>
#include <vector>
const int64_t MOD = 1000000007LL;
const int JUMP4 = 2 << 4;
const int JUMP8 = 2 << 8;
const int JUMP12 = 2 << 12;
const int JUMP16 = 2 << 16;
const int N = 2 << 19;
typedef struct {
int64_t mul, add, jump4_mul, jump4_add, jump8_mul, jump8_add, jump12_mul, jump12_add, jump16_mul, jump16_add, partial;
int next_add, next_mul;
} isc_t;
int main () {
isc_t isc;
isc.mul = 1;
isc.add = 0;
isc.jump4_mul = -1;
isc.jump4_add = -1;
isc.jump8_mul = -1;
isc.jump8_add = -1;
isc.jump12_mul = -1;
isc.jump12_add = -1;
isc.jump16_mul = -1;
isc.jump16_add = -1;
isc.next_add = -1;
isc.next_mul = -1;
isc.partial = 0;
int n, q, i, j, l, r, nm;
int64_t mul, add, x;
bool large;
scanf("%d %d", &n, &q);
std::vector<isc_t> iscs(N, isc);
for (i = 0; i < n; ++i) {
scanf("%lld %lld", &iscs[i].add, &iscs[i].mul);
}
for (i = 0; i < N; ++i) {
iscs[i].partial = (i ? iscs[i - 1].partial : 0) + iscs[i].add;
}
for (i = N - 2; i >= 0; --i) {
if (iscs[i].add > 0) {
iscs[i].next_add = i;
}
else {
iscs[i].next_add = iscs[i + 1].next_add;
}
if (iscs[i].mul > 1) {
iscs[i].next_mul = i;
}
else {
iscs[i].next_mul = iscs[i + 1].next_mul;
}
}
for (i = 0; i < N; i += JUMP4) {
mul = 1;
add = 0;
for (j = i; j < i + JUMP4; ++j) {
if (iscs[j].mul == 1) {
add = (add + iscs[j].add) % MOD;
}
else {
mul = (mul * iscs[j].mul) % MOD;
add = (add * iscs[j].mul) % MOD;
}
}
iscs[i].jump4_mul = mul;
iscs[i].jump4_add = add;
}
for (i = 0; i < N; i += JUMP8) {
mul = 1;
add = 0;
for (j = i; j < i + JUMP8; ++j) {
if (iscs[j].mul == 1) {
add = (add + iscs[j].add) % MOD;
}
else {
mul = (mul * iscs[j].mul) % MOD;
add = (add * iscs[j].mul) % MOD;
}
}
iscs[i].jump8_mul = mul;
iscs[i].jump8_add = add;
}
for (i = 0; i < N; i += JUMP12) {
mul = 1;
add = 0;
for (j = i; j < i + JUMP12; ++j) {
if (iscs[j].mul == 1) {
add = (add + iscs[j].add) % MOD;
}
else {
mul = (mul * iscs[j].mul) % MOD;
add = (add * iscs[j].mul) % MOD;
}
}
iscs[i].jump12_mul = mul;
iscs[i].jump12_add = add;
}
for (i = 0; i < N; i += JUMP16) {
mul = 1;
add = 0;
for (j = i; j < i + JUMP16; ++j) {
if (iscs[j].mul == 1) {
add = (add + iscs[j].add) % MOD;
}
else {
mul = (mul * iscs[j].mul) % MOD;
add = (add * iscs[j].mul) % MOD;
}
}
iscs[i].jump16_mul = mul;
iscs[i].jump16_add = add;
}
for (i = 0; i < q; ++i) {
scanf("%lld %d %d", &x, &l, &r);
if (x == 0) {
if ((iscs[l].next_add >= r) || (iscs[l].next_add == -1)) {
printf("0\n");
continue;
}
x = iscs[iscs[l].next_add].add;
l = iscs[l].next_add + 1;
}
if (l >= r) {
printf("%lld\n", x);
continue;
}
large = false;
while (l < r) {
if (x >= MOD) {
x %= MOD;
large = true;
}
if (large) {
if ((iscs[l].jump16_add != -1) && (l + JUMP16 <= r)) {
x = x * iscs[l].jump16_mul + iscs[l].jump16_add;
l += JUMP16;
}
else if ((iscs[l].jump12_add != -1) && (l + JUMP12 <= r)) {
x = x * iscs[l].jump12_mul + iscs[l].jump12_add;
l += JUMP12;
}
else if ((iscs[l].jump8_add != -1) && (l + JUMP8 <= r)) {
x = x * iscs[l].jump8_mul + iscs[l].jump8_add;
l += JUMP8;
}
else if ((iscs[l].jump4_add != -1) && (l + JUMP4 <= r)) {
x = x * iscs[l].jump4_mul + iscs[l].jump4_add;
l += JUMP4;
}
else {
if (iscs[l].mul > 1) {
x *= iscs[l].mul;
}
else {
x += iscs[l].add;
}
++l;
}
}
else {
nm = (iscs[l].next_mul == -1) ? (r + 1) : iscs[l].next_mul;
if (nm >= r) {
x += iscs[r - 1].partial - (l ? iscs[l - 1].partial : 0);
l = r;
}
else {
x += iscs[nm - 1].partial - (l ? iscs[l - 1].partial : 0);
if (x + iscs[nm].add > x * iscs[nm].mul) {
x += iscs[nm].add;
}
else {
x *= iscs[nm].mul;
}
l = nm + 1;
}
}
}
printf("%lld\n", x % MOD);
}
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 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | #include <cstdio> #include <cstdint> #include <vector> const int64_t MOD = 1000000007LL; const int JUMP4 = 2 << 4; const int JUMP8 = 2 << 8; const int JUMP12 = 2 << 12; const int JUMP16 = 2 << 16; const int N = 2 << 19; typedef struct { int64_t mul, add, jump4_mul, jump4_add, jump8_mul, jump8_add, jump12_mul, jump12_add, jump16_mul, jump16_add, partial; int next_add, next_mul; } isc_t; int main () { isc_t isc; isc.mul = 1; isc.add = 0; isc.jump4_mul = -1; isc.jump4_add = -1; isc.jump8_mul = -1; isc.jump8_add = -1; isc.jump12_mul = -1; isc.jump12_add = -1; isc.jump16_mul = -1; isc.jump16_add = -1; isc.next_add = -1; isc.next_mul = -1; isc.partial = 0; int n, q, i, j, l, r, nm; int64_t mul, add, x; bool large; scanf("%d %d", &n, &q); std::vector<isc_t> iscs(N, isc); for (i = 0; i < n; ++i) { scanf("%lld %lld", &iscs[i].add, &iscs[i].mul); } for (i = 0; i < N; ++i) { iscs[i].partial = (i ? iscs[i - 1].partial : 0) + iscs[i].add; } for (i = N - 2; i >= 0; --i) { if (iscs[i].add > 0) { iscs[i].next_add = i; } else { iscs[i].next_add = iscs[i + 1].next_add; } if (iscs[i].mul > 1) { iscs[i].next_mul = i; } else { iscs[i].next_mul = iscs[i + 1].next_mul; } } for (i = 0; i < N; i += JUMP4) { mul = 1; add = 0; for (j = i; j < i + JUMP4; ++j) { if (iscs[j].mul == 1) { add = (add + iscs[j].add) % MOD; } else { mul = (mul * iscs[j].mul) % MOD; add = (add * iscs[j].mul) % MOD; } } iscs[i].jump4_mul = mul; iscs[i].jump4_add = add; } for (i = 0; i < N; i += JUMP8) { mul = 1; add = 0; for (j = i; j < i + JUMP8; ++j) { if (iscs[j].mul == 1) { add = (add + iscs[j].add) % MOD; } else { mul = (mul * iscs[j].mul) % MOD; add = (add * iscs[j].mul) % MOD; } } iscs[i].jump8_mul = mul; iscs[i].jump8_add = add; } for (i = 0; i < N; i += JUMP12) { mul = 1; add = 0; for (j = i; j < i + JUMP12; ++j) { if (iscs[j].mul == 1) { add = (add + iscs[j].add) % MOD; } else { mul = (mul * iscs[j].mul) % MOD; add = (add * iscs[j].mul) % MOD; } } iscs[i].jump12_mul = mul; iscs[i].jump12_add = add; } for (i = 0; i < N; i += JUMP16) { mul = 1; add = 0; for (j = i; j < i + JUMP16; ++j) { if (iscs[j].mul == 1) { add = (add + iscs[j].add) % MOD; } else { mul = (mul * iscs[j].mul) % MOD; add = (add * iscs[j].mul) % MOD; } } iscs[i].jump16_mul = mul; iscs[i].jump16_add = add; } for (i = 0; i < q; ++i) { scanf("%lld %d %d", &x, &l, &r); if (x == 0) { if ((iscs[l].next_add >= r) || (iscs[l].next_add == -1)) { printf("0\n"); continue; } x = iscs[iscs[l].next_add].add; l = iscs[l].next_add + 1; } if (l >= r) { printf("%lld\n", x); continue; } large = false; while (l < r) { if (x >= MOD) { x %= MOD; large = true; } if (large) { if ((iscs[l].jump16_add != -1) && (l + JUMP16 <= r)) { x = x * iscs[l].jump16_mul + iscs[l].jump16_add; l += JUMP16; } else if ((iscs[l].jump12_add != -1) && (l + JUMP12 <= r)) { x = x * iscs[l].jump12_mul + iscs[l].jump12_add; l += JUMP12; } else if ((iscs[l].jump8_add != -1) && (l + JUMP8 <= r)) { x = x * iscs[l].jump8_mul + iscs[l].jump8_add; l += JUMP8; } else if ((iscs[l].jump4_add != -1) && (l + JUMP4 <= r)) { x = x * iscs[l].jump4_mul + iscs[l].jump4_add; l += JUMP4; } else { if (iscs[l].mul > 1) { x *= iscs[l].mul; } else { x += iscs[l].add; } ++l; } } else { nm = (iscs[l].next_mul == -1) ? (r + 1) : iscs[l].next_mul; if (nm >= r) { x += iscs[r - 1].partial - (l ? iscs[l - 1].partial : 0); l = r; } else { x += iscs[nm - 1].partial - (l ? iscs[l - 1].partial : 0); if (x + iscs[nm].add > x * iscs[nm].mul) { x += iscs[nm].add; } else { x *= iscs[nm].mul; } l = nm + 1; } } } printf("%lld\n", x % MOD); } return 0; } |
English