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
| #include <bits/stdc++.h> #define ls (x << 1) #define rs (x << 1| 1)
using namespace std;
typedef long long ll; const int maxn = 1e5 + 10; const int mod = 1e9 + 7;
inline int __read() { int x(0), t(1); char o (getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) { x = (x << 1) + (x << 3) + (o ^ 48); } return x * t; }
int n, p; int tagt[maxn << 2], tagp[maxn << 2], ans[maxn << 2];
inline void push_up(int x) { ans[x] = (ans[ls] + ans[rs]) % p; }
void Build(int l, int r, int x = 1) { tagt[x] = 1; if (l == r) { ans[x] = __read() % p; return ; } int mid = (l + r) >> 1; Build(l, mid, ls); Build(mid + 1, r, rs); push_up(x); }
inline void f(int x, int l, int r, int valt, int valp) { ans[x] = 1ll * ans[x] * valt % p; ans[x] = (ans[x] + 1ll * valp * (r - l + 1) % p) % p; tagp[x] = (1ll * tagp[x] * valt % p + valp) % p; tagt[x] = 1ll * tagt[x] * valt % p; }
inline void push_down(int x, int l, int r) { int mid = (l + r) >> 1; f(ls, l, mid, tagt[x], tagp[x]); f(rs, mid + 1, r, tagt[x], tagp[x]); tagt[x] = 1, tagp[x] = 0; }
void update(int l, int r, int tl, int tr, int valt, int valp, int x = 1) { if (l >= tl && r <= tr) { f(x, l, r, valt, valp); return ; } push_down(x, l, r); int mid = (l + r) >> 1; if (tl <= mid) update(l, mid, tl, tr, valt, valp, ls); if (tr > mid) update(mid + 1, r, tl, tr, valt, valp, rs); push_up(x); }
int Query(int l, int r, int tl, int tr, int x = 1) { if (l >= tl && r <= tr) return ans[x] % p; int mid = (l + r) >> 1; push_down(x, l, r); ll res(0); if (tl <= mid) res = Query(l, mid, tl, tr, ls); if (tr > mid) res = (res + Query(mid + 1, r, tl, tr, rs)) % p; return res % p; }
signed main() { n = __read(), p = __read(); Build(1, n); int m = __read(); while (m--) { int opt = __read(), l = __read(), r = __read(); if (opt == 3) printf ("%d\n", Query(1, n, l, r) % p); else if (opt == 2) { int x = __read(); update(1, n, l, r, 1, x); } else { int x = __read(); update(1, n, l, r, x, 0); } } }
|