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
| #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5, M = 4e5 + 5; using ll = long long; #define int long long int n, m, q, t[M], a[N], lazy1[M], lazy2[M]; void build(int l, int r, int p) { lazy1[p]=1; if (l == r) { t[p] = a[l] % m; return; } int mid = l + ((r - l) >> 1), lc = p << 1, rc = lc | 1; build(l, mid, lc); build(mid + 1, r, rc); t[p] = (t[lc] + t[rc]) % m; } inline void update(int i,int j,int p,int mid,int lc,int rc) { t[lc] = (t[lc] * lazy1[p] % m + lazy2[p] * (mid - i + 1) % m) % m; t[rc] = (t[rc] * lazy1[p] % m + lazy2[p] * (j - mid) % m) % m; lazy1[lc] = lazy1[lc] * lazy1[p] % m; lazy1[rc] = lazy1[rc] * lazy1[p] % m; lazy2[lc] = (lazy2[lc] * lazy1[p] % m + lazy2[p]) % m; lazy2[rc] = (lazy2[rc] * lazy1[p] % m + lazy2[p]) % m; lazy1[p] = 1; lazy2[p] = 0; } void add(int l, int r, int i, int j, int p, int k) { if (l <= i && j <= r) { t[p] = (t[p] + (j - i + 1) * k % m) % m; lazy2[p] = (lazy2[p] + k) % m; return; } int mid = i + ((j - i) >> 1), lc = p << 1, rc = lc | 1; update(i,j,p,mid,lc,rc); if (l <= mid) add(l, r, i, mid, lc, k); if (mid < r) add(l, r, mid + 1, j, rc, k); t[p] = (t[lc] + t[rc]) % m; } void mul(int l, int r, int i, int j, int p, int k) { if (l <= i && j <= r) { t[p] = t[p] * k % m; lazy1[p] = lazy1[p] * k % m; lazy2[p] = lazy2[p] * k % m; return; } int mid = i + ((j - i) >> 1), lc = p << 1, rc = lc | 1; update(i,j,p,mid,lc,rc); if (l <= mid) mul(l, r, i, mid, lc, k); if (mid < r) mul(l, r, mid + 1, j, rc, k); t[p] = (t[lc] + t[rc]) % m; } int getsum(int l, int r, int i, int j, int p) { if (l <= i && j <= r) { return t[p]; } int mid = i + ((j - i) >> 1), lc = p << 1, rc = lc | 1; update(i,j,p,mid,lc,rc); int sum = 0; if (l <= mid) sum = getsum(l, r, i, mid, lc); if (mid < r) sum += getsum(l, r, mid + 1, j, rc); return sum % m; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); cin >> n >> q >> m; for (int i = 1; i <= n; i++) cin >> a[i]; build(1, n, 1); int cmd, l, r, k; while (q--) { cin >> cmd; switch (cmd) { case 1: cin >> l >> r >> k; mul(l, r, 1, n, 1, k % m); break; case 2: cin >> l >> r >> k; add(l, r, 1, n, 1, k % m); break; default: cin >> l >> r; cout << getsum(l, r, 1, n, 1) << endl; break; } } return 0; }
|