把线段树1的代码改了改交上去为什么没过啊。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5 +10;
ll n , m , q;
ll p;
ll a[N];
struct node{
ll num;
ll ls , rs;
ll lazy;
ll laza;
}tr[N<<2];
#define lson tr[rt].ls
#define rson tr[rt].rs
#define mid (lson + rson) >> 1
void build(ll rt , ll l , ll r) {
lson = l;
rson = r;
if(l == r) {
tr[rt].num = a[l];
return;
}
build(rt << 1 , l , (mid));
build(rt << 1 | 1, (mid) + 1 , r);
tr[rt].num = tr[rt << 1].num + tr[rt << 1 | 1].num;
tr[rt].num %= p;
}
void push(ll rt) {
ll lazy = tr[rt].lazy;
ll laza = tr[rt].laza;
if(lazy) {
tr[rt << 1].num = lazy * tr[rt << 1].num + (tr[rt << 1].rs - tr[rt << 1].ls + 1) * laza;
tr[rt << 1].lazy *= lazy;
tr[rt << 1].laza = (tr[rt << 1].laza*lazy+laza);
tr[rt << 1].num %= p;
tr[rt << 1].lazy %= p;
tr[rt << 1].laza %= p;
tr[rt << 1 | 1].num = lazy * tr[rt << 1 | 1].num + (tr[rt << 1 | 1].rs - tr[rt << 1 | 1].ls + 1) * laza;
tr[rt << 1 | 1].lazy *= lazy;
tr[rt << 1 | 1].laza = (tr[rt << 1].laza*lazy+laza);
tr[rt << 1 | 1].num %= p;
tr[rt << 1 | 1].lazy %= p;
tr[rt << 1 | 1].laza %= p;
tr[rt].lazy = 1, tr[rt].laza = 0;
}
}
void update(ll rt , ll l , ll r , ll v) {
if(l <= lson && r >= rson) {
tr[rt].num += v * (rson - lson + 1) % p;
tr[rt].num %= p;
tr[rt].laza += v;
tr[rt].laza %= p;
return;
}
push(rt);
if(l <= mid) update(rt << 1 , l , r , v);
if(r > mid) update(rt << 1 | 1 , l , r , v);
tr[rt].num = tr[rt << 1].num + tr[rt << 1 | 1].num;
tr[rt].num %= p;
}
void updata(ll rt , ll l , ll r , ll v) {
if(l <= lson && r >= rson) {
tr[rt].laza *= v;
tr[rt].lazy *= v;
tr[rt].num *= v;
tr[rt].laza %= p;
tr[rt].lazy %= p;
tr[rt].num %= p;
return;
}
push(rt);
if(l <= mid) updata(rt << 1 , l , r , v);
if(r > mid) updata(rt << 1 | 1 , l , r , v);
tr[rt].num = tr[rt << 1].num + tr[rt << 1 | 1].num;
tr[rt].num %= p;
}
ll query(ll rt , ll l , ll r) {
if(l <= lson && r >= rson) return tr[rt].num;
push(rt);
ll ans = 0;
if(l <= mid) ans += query(rt << 1 , l , r) % p;
if(r > mid) ans += query(rt << 1 | 1 , l , r) % p;
return ans % p;
}
int main() {
scanf("%lld%lld%lld" , &n , &m , &p);
for(int i = 1; i <= n ; i++) {
scanf("%lld" , &a[i]);
}
build(1 , 1 , n);
while(m--) {
ll op , x , y , h;
scanf("%lld" , &op);
if(op-1) {
if(op&1) {
scanf("%lld%lld" , &x , &y);
printf("%lld\n" , query(1 , x , y));
}
else {
scanf("%lld%lld%lld" , &x , &y , &h);
update(1 , x , y , h);
}
}
else {
scanf("%lld%lld%lld" , &x , &y , &h);
updata(1 , x , y , h);
}
}
}