rt,代码如下:
#include <iostream>
#define SIZE 100010
using namespace std;
long long Seq[SIZE],SegTree[SIZE*4],Lzy_add[SIZE*4],Lzy_mul[SIZE*4];
int N,M,P;
inline void pushup(const int u){
SegTree[u] = (SegTree[u<<1] + SegTree[(u<<1)+1]) % P;
}
inline void maketag(int u,int L,int R,long long val,int type){
if (type==1){
(Lzy_add[u] *= val) %= P;
(Lzy_mul[u] *= val) %= P;
(SegTree[u] *= val) %= P;
}
else{
(Lzy_add[u] += val) %= P;
(SegTree[u] += (R-L+1) * val) %= P;
}
}
void pushdown(int u,int L,int R){
int M = (L+R) >> 1;
maketag(u<<1,L,M,Lzy_mul[u],1);
maketag(u<<1,L,M,Lzy_add[u],2);
maketag((u<<1)+1,M+1,R,Lzy_mul[u],1);
maketag((u<<1)+1,M+1,R,Lzy_add[u],2);
Lzy_mul[u] = 1;
Lzy_add[u] = 0;
}
void build(int u,int L,int R){
Lzy_mul[u] = 1;
Lzy_add[u] = 0;
if (L==R){
SegTree[u] = Seq[L] % P;
return;
}
else{
int M = L + ((R - L) >> 1);
build(u<<1,L,M),build((u<<1)+1,M+1,R);
pushup(u);
}
}
long long sectionquery(int u,int L,int R,int l,int r){
if ((l<=L) && (R<=r)) return SegTree[u];
else if (!((L>r) || (R<l))){
int M = (L+R) >> 1;
pushdown(u,L,R);
return (sectionquery(u<<1,L,M,l,r)+sectionquery((u<<1)+1,M+1,R,l,r)) % P;
}
else return 0;
}
void sectionupdate(int u,int L,int R,int l,int r,long long val,int type){
if ((l<=L) && (R<=r)) maketag(u,L,R,val,type);
else if (!((L>r) || (R<l))){
int M = (L+R) >> 1;
pushdown(u,L,R);
sectionupdate(u<<1,L,M,l,r,val,type);
sectionupdate((u<<1)+1,M+1,R,l,r,val,type);
pushup(u);
}
}
int main(){
scanf("%d %d %d", &N, &M, &P);
for (int i=1;i<=N;i++) scanf("%lld", &SegTree[i]);
build(1, 1, N);
while (M--){
int op, x, y;
scanf("%d", &op);
long long k;
if (op==1){
scanf("%d %d %lld", &x, &y, &k);
sectionupdate(1, 1, N, x, y, k, 1);
}
else if (op==2){
scanf("%d %d %lld", &x, &y, &k);
sectionupdate(1, 1, N, x, y, k, 2);
}
else{
scanf("%d %d", &x, &y);
printf("%lld\n", sectionquery(1, 1, N, x, y));
}
}
return 0;
}