#include<iostream>
#include<cstdio>
using namespace std;
struct Node
{
int l,r;
long long sum,add,mul;
}tree[1000005];
int n,m,q,a[100005];
void build(int p,int l,int r)
{
tree[p].l=l;
tree[p].r=r;
if(l==r)
{
tree[p].sum=a[l]%q;
tree[p].mul=1;
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tree[p].sum=(tree[p*2].sum+tree[p*2+1].sum)%q;
tree[p].mul=tree[p*2].mul*tree[p*2+1].mul;
}
void spread(int p)
{
if(tree[p].add||tree[p].mul)
{
tree[p*2].sum+=tree[p].add*(tree[p*2].r-tree[p*2].l+1);
tree[p*2+1].sum+=tree[p].add*(tree[p*2+1].r-tree[p*2+1].l+1);
tree[p*2].sum*=tree[p].mul;
tree[p*2+1].sum*=tree[p].mul;
tree[p*2].add+=tree[p].add;
tree[p*2+1].add+=tree[p].add;
tree[p*2].mul*=tree[p].mul;
tree[p*2+1].mul*=tree[p].mul;
tree[p].add=0;
tree[p].mul=1;
}
return;
}
void change(int p,int l,int r,int opt,long long k)
{
spread(p);
if(l<=tree[p].l&&r>=tree[p].r)
{
if(opt==1)
{
tree[p].mul*=k;
tree[p].sum=tree[p].sum*k%q;
}
else
{
tree[p].add+=k;
tree[p].sum=(tree[p].sum+k*(tree[p].r-tree[p].l+1)%q)%q;
}
return;
}
int mid=(tree[p].l+tree[p].r)/2;
if(l<=mid) change(p*2,l,r,opt,k);
if(r>mid) change(p*2+1,l,r,opt,k);
tree[p].sum=(tree[p*2].sum+tree[p*2+1].sum)%q;
return;
}
long long ask(int p,int l,int r)
{
if(l<=tree[p].l&&r>=tree[p].r) return tree[p].sum;
spread(p);
int mid=(tree[p].l+tree[p].r)/2;
long long val=0;
if(l<=mid) val=(val+ask(p*2,l,r))%q;
if(r>mid) val=(val+ask(p*2+1,l,r))%q;
return val;
}
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--)
{
int opt,x,y;
long long k;
cin>>opt>>x>>y;
if(opt==1||opt==2)
{
cin>>k;
change(1,x,y,opt,k%q);
}
else cout<<ask(1,x,y)%q<<endl;
}
return 0;
}
只有#1#3#4 AC
其余全WA
跪求dalao帮忙康康代码