#include <cstdio>
#include <vector>
using std::vector;
const int M = 501'013;
const int Q = 1'000'000'007;
int dol(long long x) {
if (x >= Q) return x%Q + Q;
return x;
}
int krok2(long long x, int a, int b) {
if (x + a < x * b) {
return dol(x * b);
}
return dol(x+a);
}
long long odw(int x) {
x %= Q;
int n = Q-2;
int ret = 1;
while(n) {
if (n % 2) ret = ((long long)ret) * x % Q;
x = ((long long)x) * x % Q;
n /= 2;
}
return ret;
}
int n, a[M], b[M];
int nda[M], n2b[M];
long long sa[M], ilb[M], sab[M];
int all(int x, int l, int r) {
int ret = (x * ilb[r] % Q) * odw(ilb[l]) % Q;
ret = (ret + ((sab[l]-sab[r]+Q) * odw(ilb[n]) % Q) * ilb[r]) % Q;
return (ret % Q + Q) % Q;
}
int go(int x, int l, int r) {
//printf(" :: %d %d %d\n", x, l, r);
if (x == 0) l = nda[l];
if (l >= r) return x;
if (x == 0) return go(a[l], l+1, r);
if (x >= Q) return all(x, l, r);
if (b[l] > 1) {
return go(krok2(x, a[l], b[l]), l+1, r);
}
int s = std::min(r, n2b[l]);
return go(dol(sa[s] - sa[l] + x), s, r);
}
int main() {
int q;
scanf("%d %d", &n, &q);
sa[0] = 0;
ilb[0] = 1;
for (int i = 0; i < n; i++) {
scanf("%d %d", &a[i], &b[i]);
sa[i+1] = sa[i] + a[i];
ilb[i+1] = ilb[i] * b[i] % Q;
}
nda[n] = n;
n2b[n] = n;
sab[n] = 0;
long long ib = 1;
for (int i = n-1; i >= 0; i--) {
sab[i] = sab[i+1];
if (b[i] == 1) sab[i] = (sab[i] + a[i] * ib) % Q;
ib = (ib * b[i]) % Q;
if (a[i] > 0) nda[i] = i;
else nda[i] = nda[i+1];
if (b[i] >= 2) n2b[i] = i;
else n2b[i] = n2b[i+1];
}
for (int i = 0; i < q; i++) {
int l,r,x;
scanf("%d %d %d", &x,&l,&r);
printf("%d\n", go(x, l, r) % Q);
}
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 | #include <cstdio> #include <vector> using std::vector; const int M = 501'013; const int Q = 1'000'000'007; int dol(long long x) { if (x >= Q) return x%Q + Q; return x; } int krok2(long long x, int a, int b) { if (x + a < x * b) { return dol(x * b); } return dol(x+a); } long long odw(int x) { x %= Q; int n = Q-2; int ret = 1; while(n) { if (n % 2) ret = ((long long)ret) * x % Q; x = ((long long)x) * x % Q; n /= 2; } return ret; } int n, a[M], b[M]; int nda[M], n2b[M]; long long sa[M], ilb[M], sab[M]; int all(int x, int l, int r) { int ret = (x * ilb[r] % Q) * odw(ilb[l]) % Q; ret = (ret + ((sab[l]-sab[r]+Q) * odw(ilb[n]) % Q) * ilb[r]) % Q; return (ret % Q + Q) % Q; } int go(int x, int l, int r) { //printf(" :: %d %d %d\n", x, l, r); if (x == 0) l = nda[l]; if (l >= r) return x; if (x == 0) return go(a[l], l+1, r); if (x >= Q) return all(x, l, r); if (b[l] > 1) { return go(krok2(x, a[l], b[l]), l+1, r); } int s = std::min(r, n2b[l]); return go(dol(sa[s] - sa[l] + x), s, r); } int main() { int q; scanf("%d %d", &n, &q); sa[0] = 0; ilb[0] = 1; for (int i = 0; i < n; i++) { scanf("%d %d", &a[i], &b[i]); sa[i+1] = sa[i] + a[i]; ilb[i+1] = ilb[i] * b[i] % Q; } nda[n] = n; n2b[n] = n; sab[n] = 0; long long ib = 1; for (int i = n-1; i >= 0; i--) { sab[i] = sab[i+1]; if (b[i] == 1) sab[i] = (sab[i] + a[i] * ib) % Q; ib = (ib * b[i]) % Q; if (a[i] > 0) nda[i] = i; else nda[i] = nda[i+1]; if (b[i] >= 2) n2b[i] = i; else n2b[i] = n2b[i+1]; } for (int i = 0; i < q; i++) { int l,r,x; scanf("%d %d %d", &x,&l,&r); printf("%d\n", go(x, l, r) % Q); } return 0; } |
English