rt,实在不知道到底哪里错了,求条
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 100005;
int a[maxn], p;
struct SegmentTree{
int l, r, add_val;
int tag, tag2; // tag 是加法的, tag2 是乘法的
}tr[maxn * 4];
void build(int p, int l, int r){
tr[p].l = l, tr[p].r = r, tr[p].tag2 = 1;
if(l == r){
tr[p].add_val = a[l] % p;
return;
}
int mid = (l + r) >> 1;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
tr[p].add_val = (tr[p * 2].add_val +
tr[p * 2 + 1].add_val) % p;
}
void pushdown(int p){
int mid = (tr[p].l + tr[p].r) >> 1;
tr[p * 2].add_val = (tr[p * 2].add_val * tr[p].tag2 % p+
tr[p].tag * (tr[p * 2].r - tr[p * 2].l + 1) % p) % p;
tr[p * 2 + 1].add_val = (tr[p * 2 + 1].add_val * tr[p].tag2 % p +
tr[p].tag * (tr[p * 2 + 1].r - tr[p * 2 + 1].l + 1) % p) % p;
tr[p * 2].tag2 = (tr[p * 2].tag2 * tr[p].tag2) % p;
tr[p * 2 + 1].tag2 = (tr[p * 2 + 1].tag2 * tr[p].tag2) % p;
tr[p * 2].tag = (tr[p * 2].tag * tr[p].tag2 + tr[p].tag) % p;
tr[p * 2 + 1].tag = (tr[p * 2 + 1].tag * tr[p].tag2 + tr[p].tag) % p;
tr[p].tag = 0, tr[p].tag2 = 1;
}
void update(int p, int l, int r, int val){
if(l <= tr[p].l && r >= tr[p].r){
tr[p].add_val = (tr[p].add_val + val * (tr[p].r - tr[p].l + 1) % p) % p;
tr[p].tag = (tr[p].tag + val) % p;
return;
}
pushdown(p);
//toto
int mid = (tr[p].l + tr[p].r) >> 1;
if(l <= mid) update(p * 2, l, r, val);
if(r > mid) update(p * 2 + 1, l, r, val);
tr[p].add_val = tr[p * 2].add_val + tr[p * 2 + 1].add_val;
}
void update2(int p, int l, int r, int val){
if(l <= tr[p].l && r >= tr[p].r){
tr[p].tag2 = tr[p].tag2 * val % p;
tr[p].tag = tr[p].tag * val % p;
tr[p].add_val = tr[p].add_val * val % p;
return;
}
pushdown(p);
int mid = (tr[p].l + tr[p].r) >> 1;
if(l <= mid) update2(p * 2, l, r, val);
if(r > mid) update2(p * 2 + 1, l, r, val);
tr[p].add_val = tr[p * 2].add_val * tr[p * 2 + 1].add_val;
}
int query(int p, int l, int r){
if(l <= tr[p].l && r >= tr[p].r){
return tr[p].add_val;
}
pushdown(p);
int mid = (tr[p].l + tr[p].r) >> 1, ans = 0;
if(l <= mid) ans += query(p * 2, l, r), ans %= p;
if(r > mid) ans += query(p * 2 + 1, l, r), ans %= p;
return ans;
}
int32_t main(){
int n, m; cin >> n >> m >> p;
for(int i = 1; i <= n; i ++) cin >> a[i];
build(1, 1, n);
for(int i = 1; i <= m; i ++){
int op, l, r, val;
cin >> op >> l >> r;
if(op == 1) cin >> val, update2(1, l, r, val);
else if(op == 2) cin >> val, update(1, l, r, val);
else cout << query(1, l, r) << endl;
}
}