#include<bits/stdc++.h>
using namespace std;
long long a[1000500],tr[1000500],ans[1000500],b[1000500],he[1000050],lazy[1000500],busy[1000050];
long long mid,n,m,ji=0,sum=0,pop;
void build(long long k,long long l,long long r)
{
busy[k]=1;
lazy[k]=0;
if(l==r){
tr[k]=a[l]%pop;
return ;
}
long long mid=(r-l)/2+l;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
tr[k]=tr[k*2+1]+tr[k*2];
tr[k]=tr[k]%pop;
}
void check(long long x,long long y)
{
for(;x!=1;){
tr[x/2]+=y;
tr[x/2]=tr[x/2]%pop;
x=x/2;
}
}
void push(long long k,long long l,long long r)
{
tr[k]=tr[k]*busy[k]%pop;
busy[k*2]=busy[k*2]*busy[k]%pop;
lazy[k*2]=lazy[k*2]*busy[k]%pop;
busy[k*2+1]=busy[k*2+1]*busy[k]%pop;
lazy[k*2+1]=lazy[k*2+1]*busy[k]%pop;
busy[k]=1;
if(lazy[k]!=0){
lazy[k*2]+=lazy[k];
lazy[k*2+1]+=lazy[k];
lazy[k*2+1]=lazy[k*2+1]%pop;
lazy[k*2]=lazy[k*2]%pop;
tr[k]+=(r-l+1)*lazy[k]%pop;
lazy[k]=0;
}
}
void change(long long k,long long l,long long r,long long cha1,long long cha2,long long jia)//cha1?a2??¨¬|???¨¬????????¡ì?¨¦??¨¬???|?¡ì????¡ìo?cha2?a??¨¬???¨¬????|?¡ì????¡ìo?l?a??¡ì?¨¦??¨¬???????¡ìo?r?a??¨¬???¨¬????????¡ìo?jia?a2??¨¬????¡ì?¨¦??
{
if(l==cha1&&r==cha2)
{
check(k,tr[k]*(jia-1)*busy[k]);
check(k,lazy[k]*(jia-1));
busy[k]=jia*busy[k]%pop;
lazy[k]=lazy[k]*jia%pop;
return ;
}
if(l<=cha1&&r>=cha2){
push(k,l,r);
long long mid=(r-l)/2+l;
if(mid>=cha2) change(k*2,l,mid,cha1,cha2,jia);
if(mid+1<=cha1) change(k*2+1,mid+1,r,cha1,cha2,jia);
if(mid<cha2&&cha1<mid+1) {
change(k*2,l,mid,cha1,mid,jia);
change(k*2+1,mid+1,r,mid+1,cha2,jia);
}
}
} //-------------------------------------------------------------------
void gai(long long k,long long l,long long r,long long cha1,long long cha2,long long jia)//cha1?a2??¨¬|???¨¬????????¡ì?¨¦??¨¬???|?¡ì????¡ìo?cha2?a??¨¬???¨¬????|?¡ì????¡ìo?l?a??¡ì?¨¦??¨¬???????¡ìo?r?a??¨¬???¨¬????????¡ìo?jia?a2??¨¬????¡ì?¨¦??
{
if(l==cha1&&r==cha2){
check(k,(cha2-cha1+1)*jia);
lazy[k]+=jia;
lazy[k]=lazy[k]%pop;
return ;
}
if(l<=cha1&&r>=cha2){
push(k,l,r);
long long mid=(r-l)/2+l;
if(mid>=cha2) gai(k*2,l,mid,cha1,cha2,jia);
if(mid+1<=cha1) gai(k*2+1,mid+1,r,cha1,cha2,jia);
if(mid<cha2&&cha1<mid+1) {
gai(k*2,l,mid,cha1,mid,jia);
gai(k*2+1,mid+1,r,mid+1,cha2,jia);
}
}
} //-------------------------------------------------------------------
void yong(long long k,long long l,long long r,long long cha1,long long cha2)
{
if(l==cha1&&r==cha2){
sum=sum+busy[k]*tr[k]+(r-l+1)*lazy[k];
sum=sum%pop;
return ;
}
if(l<=cha1&&r>=cha2){
push(k,l,r);
long long mid=(r-l)/2+l;
if(mid>=cha2) yong(k*2,l,mid,cha1,cha2);
if(mid+1<=cha1) yong(k*2+1,mid+1,r,cha1,cha2);
if(mid<cha2&&cha1<mid+1) {
yong(k*2,l,mid,cha1,mid);
yong(k*2+1,mid+1,r,mid+1,cha2);
}
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&pop);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
long long pan,l1,l2,c;
for(long long i=1;i<=m;i++){
scanf("%lld",&pan);
if(pan==1){
scanf("%lld%lld%lld",&l1,&l2,&c);
change(1,1,n,l1,l2,c);
}
if(pan==2){
scanf("%lld%lld%lld",&l1,&l2,&c);
gai(1,1,n,l1,l2,c);
}
if(pan==3){
ji++;
scanf("%lld%lld",&l1,&l2);
sum=0;
yong(1,1,n,l1,l2);
ans[ji]=sum;
sum=0;
}
}
for(long long i=1;i<=ji;i++){
printf("%lld\n",ans[i]);
}
return 0;
}
30分(#1#3#4)
感觉没问题
求dalao指点