#include<bits/stdc++.h>
#define ls pos<<1,l,mid
#define rs pos<<1|1,mid+1,r
#define N 100001
using namespace std;
struct node{
int mul,plus,sum;
}t[N<<2];
int a[N];
int P,T,n;
void pushup(int pos)
{
t[pos].sum=t[pos<<1].sum+t[pos<<1|1].sum;
t[pos].sum%=P;
// cout<<t[pos].sum<<endl;
return;
}
void Add(int pos,int l,int r,int fa)
{
t[pos].mul*=t[fa].mul;
t[pos].mul%=P;
t[pos].plus*=t[fa].mul;
t[pos].plus%=P;
t[pos].plus+=t[fa].plus;
t[pos].plus%=P;
t[pos].sum*=t[fa].mul;
t[pos].sum%=P;
t[pos].sum+=t[fa].plus*(r-l+1);
t[pos].sum%=P;
return;
}
void pd(int pos,int l,int r)
{
int mid=l+r>>1;
Add(ls,pos);
Add(rs,pos);
t[pos].plus=0;
t[pos].mul=1;
return;
}
void build(int pos,int l,int r)
{
t[pos].mul=1;
t[pos].plus=0;
if(l==r)
{
t[pos].sum=a[l];
return;
}
int mid=l+r>>1;
build(ls);
build(rs);
pushup(pos);
}
void modify_mul(int pos,int l,int r,int ql,int qr,int ml)
{
if(l>=ql&&r<=qr)
{
t[pos].mul*=ml;t[pos].mul%=P;
t[pos].plus*=ml;t[pos].plus%=P;
t[pos].sum*=ml;t[pos].sum%=P;
return;
}
int mid=l+r>>1;
pd(pos,l,r);
if(ql<=mid) modify_mul(ls,ql,qr,ml);
if(qr>=mid+1)modify_mul(rs,ql,qr,ml);
pushup(pos);
}
void modify_add(int pos,int l,int r,int ql,int qr,int ad)
{
if(l>=ql&&r<=qr)
{
t[pos].plus+=ad;t[pos].plus%=P;
t[pos].sum+=ad*(r-l+1);t[pos].sum%=P;
return;
}
int mid=l+r>>1;
pd(pos,l,r);
if(ql<=mid) modify_mul(ls,ql,qr,ad);
if(qr>=mid+1)modify_mul(rs,ql,qr,ad);
pushup(pos);
}
int query(int pos,int l,int r,int ql,int qr)
{
// cout<<t[pos].sum<<endl;
if(l>=ql&&r<=qr)
return t[pos].sum;
int mid=l+r>>1,r1=0,r2=0;
pd(pos,l,r);
if(ql<=mid) r1=query(ls,ql,qr);
if(qr>=mid+1)r2=query(rs,ql,qr);
return (r1+r2)%P;
}
int main()
{
int i;
scanf("%d%d%d",&n,&T,&P);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
build(1,1,n);
short opt;
int l,r,k;
while(T--)
{
scanf("%d%d%d",&opt,&l,&r);
if(opt==1)//*
{
scanf("%d",&k);
modify_mul(1,1,n,l,r,k);
//printf("%d\n",query(1,1,n,l,r));
}
else if(opt==2)//+
{
scanf("%d",&k);
modify_add(1,1,n,l,r,k);
//printf("%d\n",query(1,1,n,l,r));
}
else//opt==3 query
{
printf("%d\n",query(1,1,n,l,r));
}
}
}
样例没过,悬赏关注