玄关,WA+RE30prs求调
提交记录
#include <bits/stdc++.h>
#define tag_mul mul_tag
#define int long long
#define root 1,n,1
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N=1e5+10;
int n,q,m,a[N];
struct Node{
int l,r;
int add_tag;
int mul_tag;
int sum;
Node() {
l=r=add_tag=sum=0;
mul_tag=1;
}
}z[N<<3];
void color_add(int rt,int v) {
(z[rt].sum+=v*(z[rt].r-z[rt].l+1))%=m;
(z[rt].add_tag+=v)%=m;
}
Node operator +(Node a,Node b){
Node c;
c.l=a.l;
c.r=b.r;
c.sum=(a.sum+b.sum)%m;
return c;
}
void push_add(int rt) {
if(z[rt].add_tag!=0) {
color_add(rt<<1,z[rt].add_tag);
color_add(rt<<1|1,z[rt].add_tag);
z[rt].add_tag=0;
}
}
void color_mul(int rt, int v) {
push_add(rt);
z[rt].sum = z[rt].sum * v % m;
z[rt].mul_tag*=v;
z[rt].mul_tag%=m;
}
void push_mul(int rt) {
if(z[rt].tag_mul!=1) {
color_mul(rt<<1,z[rt].tag_mul);
color_mul(rt<<1|1,z[rt].tag_mul);
z[rt].tag_mul=1;
}
}
void build(int l,int r,int rt){
if(l==r){
z[rt].l=z[rt].r=l;
z[rt].sum=a[l];
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
z[rt]=z[rt<<1]+z[rt<<1|1];
}
void modify_add(int l,int r,int rt,int nowl,int nowr,int val){
if(l>=nowl&&r<=nowr) {
push_add(rt);push_mul(rt);
color_add(rt,val);
return;
}
push_add(rt);push_mul(rt);
push_mul(rt);
int m=(l+r)>>1;
if(nowl<=m){
modify_add(lson,nowl,nowr,val);
}
if(nowr>m) {
modify_add(rson,nowl,nowr,val);
}
z[rt]=z[rt<<1]+z[rt<<1|1];
}
void modify_mul(int l,int r,int rt,int nowl,int nowr,int val){
if(l>=nowl&&r<=nowr) {
push_add(rt);push_mul(rt);
color_mul(rt,val);
return;
}
push_add(rt);push_mul(rt);
push_mul(rt);
int m=(l+r)>>1;
if(nowl<=m){
modify_mul(lson,nowl,nowr,val);
}
if(nowr>m) {
modify_mul(rson,nowl,nowr,val);
}
z[rt]=z[rt<<1]+z[rt<<1|1];
}
Node query(int l,int r,int rt,int nowl,int nowr) {
if(l>=nowl&&r<=nowr){
push_add(rt);push_mul(rt);
return z[rt];
}
push_add(rt);push_mul(rt);
Node res;
int m=(l+r)>>1;
if(nowl<=m){
res=res+query(lson,nowl,nowr);
}
if(nowr>m){
res=res+query(rson,nowl,nowr);
}
return res;
}
signed main() {
cin>>n>>q>>m;
for(int i=1;i<=n;++i){
cin>>a[i];
}
build(root);
while(q--) {
int opt;
cin>>opt;
if(opt==1){
int x,y,k;
cin>>x>>y>>k;
modify_mul(root,x,y,k);
}
else if(opt==2) {
int x,y,k;
cin>>x>>y>>k;
modify_add(root,x,y,k);
}
else{
int x,y;
cin>>x>>y;
cout<<query(root,x,y).sum%m<<"\n";
}
}
return 0;
}