30pts AC#1#3#4 求调```cpp #include<bits/stdc++.h> #define int long long using namespace std;
struct Node { int l, r, ans, mul, add; }; Node b[400005];
int n, p, q, x, y, k, a[100005]; void build(int id, int l, int r) { b[id].l = l, b[id].r = r; b[id].mul = 1; if(l == r) { b[id].ans = a[l]; return; } int mid = (l + r) / 2; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); b[id].ans = b[id * 2].ans + b[id * 2 + 1].ans; b[id].ans %= p; }
void pushdown(int id, int l, int r) { int mid = (l + r) / 2; b[id * 2].ans = (b[id * 2].ans * b[id].mul % p + b[id].add * (mid - b[id * 2].l + 1) % p) % p; b[id * 2 + 1].ans = (b[id * 2 + 1].ans * b[id].mul % p + b[id].add * (b[id * 2 + 1].r - mid) % p) % p; b[id * 2].mul = (b[id * 2].mul * b[id].mul) % p; b[id * 2 + 1].mul = (b[id * 2 + 1].mul * b[id].mul) % p; b[id * 2].add = (b[id * 2].add * b[id].mul % p + b[id].add) % p; b[id * 2 + 1].add = (b[id * 2 + 1].add * b[id].mul % p + b[id].add) % p; b[id].mul = 1; b[id].add = 0; }
void fun1(int id, int l, int r) { if(x <= l && r <= y) { b[id].ans = b[id].ans * k % p; b[id].mul = b[id].mul * k % p; b[id].add = b[id].add * k % p; return; } pushdown(id, l, r); int mid = (l + r) / 2; if(x <= mid) fun1(id * 2, l, mid); if(y > mid) fun1(id * 2 + 1, mid + 1, r); b[id].ans = (b[id * 2].ans + b[id * 2 + 1].ans) % p; }
void fun2(int id, int l, int r) { if(x <= l && r <= y) { b[id].add = (b[id].add + k) % p; b[id].ans = (b[id].ans + (b[id].r - b[id].l + 1) * k) % p; return; } pushdown(id, l, r); int mid = (l + r) / 2; if(x <= mid) fun2(id * 2, l, mid); if(y > mid) fun2(id * 2 + 1, mid + 1, r); b[id].ans = (b[id * 2].ans + b[id * 2 + 1].ans) % p; }
int getans(int id, int l, int r) { if(x <= l && r <= y) return b[id].ans; int mid = (l + r) / 2; int ans = 0; if(x <= mid) ans += getans(id * 2, l, mid); if(y > mid) ans += getans(id * 2 + 1, mid + 1, r); return ans % p; }
signed main() { cin >> n >> q >> p; for(int i = 1; i <= n; i++) cin >> a[i]; build(1, 1, n); while(q--) { int op; cin >> op; if(op == 1) { cin >> x >> y >> k; fun1(1, 1, n); } else if(op == 2) { cin >> x >> y >> k; fun2(1, 1, n); } else { cin >> x >> y; cout << getans(1, 1, n) << endl; } } return 0; }