rt,在本地运行时,如果把代码中所有的求余删掉,就可以完成运行,但加上之后,就莫名RE,求教大佬……
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
struct TREE
{
int l,r,sum,tag1,tag2;
};
TREE tree[400005];
int n,q,m;
int a[100005];
void pushdown(int x)
{
if(tree[x].tag1!=1)
{
tree[ls(x)].tag1=(tree[ls(x)].tag1*tree[x].tag1)%m;
tree[rs(x)].tag1=(tree[rs(x)].tag1*tree[x].tag1)%m;
tree[ls(x)].sum=(tree[ls(x)].sum*tree[x].tag1)%m;
tree[rs(x)].sum=(tree[rs(x)].sum*tree[x].tag1)%m;
tree[ls(x)].tag2=(tree[ls(x)].tag2*tree[x].tag1)%m;
tree[rs(x)].tag2=(tree[rs(x)].tag2*tree[x].tag1)%m;
tree[x].tag1=1;
}
if(tree[x].tag2)
{
tree[ls(x)].sum=(tree[ls(x)].sum+(tree[ls(x)].r-tree[ls(x)].l+1)*tree[x].tag2)%m;
tree[rs(x)].sum=(tree[rs(x)].sum+(tree[rs(x)].r-tree[rs(x)].l+1)*tree[x].tag2)%m;
tree[ls(x)].tag2=(tree[ls(x)].tag2+tree[x].tag2)%m;
tree[rs(x)].tag2=(tree[rs(x)].tag2+tree[x].tag2)%m;
tree[x].tag2=0;
}
}
void pushup(int x)
{
tree[x].sum=(tree[ls(x)].sum+tree[rs(x)].sum)%m;
}
void build(int l,int r,int root)
{
tree[root].l=l;
tree[root].r=r;
tree[root].tag1=1;
if(l==r)
{
tree[root].sum=a[l];
}
else
{
int mid=(l+r)>>1;
build(l,mid,ls(root));
build(mid+1,r,rs(root));
pushup(root);
}
}
void ud1(int l,int r,int d,int root)
{
if(l<=tree[root].l&&tree[root].r<=r)
{
tree[root].sum=(tree[root].sum*d)%m;
tree[root].tag1=(tree[root].tag1*d)%m;
tree[root].tag2=(tree[root].tag2*d)%m;
}
else
{
pushdown(root);
int mid=(tree[root].l+tree[root].r)>>1;
if(l<=mid)
{
ud1(l,r,d,ls(root));
}
if(r>=mid+1)
{
ud1(l,r,d,rs(root));
}
pushup(root);
}
}
void ud2(int l,int r,int d,int root)
{
if(l<=tree[root].l&&tree[root].r<=r)
{
tree[root].sum=tree[root].sum+d*(tree[root].r-tree[root].l+1);
tree[root].tag2=(tree[root].tag2+d)%m;
}
else
{
pushdown(root);
int mid=(tree[root].l+tree[root].r)>>1;
if(l<=mid)
{
ud2(l,r,d,ls(root));
}
if(r>=mid+1)
{
ud2(l,r,d,rs(root));
}
pushup(root);
}
}
int qu(int l,int r,int root)
{
if(l<=tree[root].l&&tree[root].r<=r)
{
return tree[root].sum;
}
pushdown(root);
int mid=(tree[root].l+tree[root].r)>>1,tot=0;
if(l<=mid)
{
tot=(tot+qu(l,r,ls(root)))%m;
}
if(r>=mid+1)
{
tot=(tot+qu(l,r,rs(root)))%m;
}
return tot;
}
signed main()
{
scanf("%lld%lld%lld",&n,&q,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,n,1);
for(int i=1;i<=q;i++)
{
int x,y,k,q;
scanf("%lld",&q);
if(q==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
ud1(x,y,k,1);
}
else if(q==2)
{
scanf("%lld%lld%lld",&x,&y,&k);
ud2(x,y,k,1);
}
else
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",qu(x,y,1));
for(int i=1;i<=m;i++)
{
printf("%lld ",qu(i,i,1));
}
printf("\n");
}
}
return 0;
}