5 5 38 1 5 4 2 3 2 1 4 1 到这里就炸了
#include<bits/stdc++.h>
#define N 100000
#define ll long long
#define mid (tree[i].r+tree[i].l)/2
using namespace std;
int n,m,p,in_put[N];
struct T{
ll sum,add,l,r;
ll mul;
}tree[4*N];
inline void build(ll i,ll l,ll r){
tree[i].mul=1;
if(tree[i].l==tree[i].r){
tree[i].sum=in_put[l]%p;
return ;
}
build(i*2,1,mid);
build(i*2+1,mid+1,r);
tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum)%p;
return ;
}
void up_date(ll i){
ll v=tree[i].mul;
tree[i].mul=1;
tree[i*2].sum=(tree[i*2].sum*v)%p;
tree[i*2+1].sum=(tree[i*2+1].sum*v)%p;
tree[i*2].add=(tree[i*2].add*v)%p;
tree[i*2+1].add=(tree[i*2+1].add*v)%p;
tree[i*2].mul*v;
tree[i*2+1].mul*v;
v=tree[i].add;
tree[i].add=0;
tree[i*2].add+=v;
tree[i*2+1].add+=v;
tree[i*2].sum+=(tree[i*2].r-tree[i*2].l+1)*v;
tree[i*2+1].sum+=(tree[i*2+1].r-tree[i*2+1].l+1)*v;
}
inline void add(ll i,ll l,ll r,ll k){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].sum+=(tree[i].r-tree[i].l+1)*k%p;
tree[i].add=(tree[i].add+k)%p;
return ;
}
up_date(i);
if(mid>=l)add(i*2,l,r,k);
if(mid<r)add(i*2+1,l,r,k);
tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum)%p;
}
inline void mul(int i,int l,int r,int j){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].sum=(tree[i].sum*j)%p;
tree[i].mul=(tree[i].mul*j)%p;
tree[i].add=(tree[i].add*j)%p;
return ;
}
up_date(i);
if(mid>=l)mul(i*2,l,r,j);
if(mid<r)mul(i*2+1,l,r,j);
tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum)%p;
}
inline ll search(ll i,ll l,ll r){
if(tree[i].l>=l&&tree[i].r<=r){
return tree[i].sum;
}
up_date(i);
ll ans=0;
if(mid>=l)ans+=search(i*2,l,r)%p;
if(mid<r)ans+=search(i*2+1,l,r)%p;
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++)cin>>in_put[i];
build(1,1,n);
fl,a,b,c;
for(int i=1;i<=m;i++){
cin>>fl;
if(fl==1){
cin>>a>>b>>c;
c%=p;
mul(1,a,b,c);
}
if(fl==2){
cin>>a>>b>>c;
c%=p;
add(1,a,b,c);
}
if(fl==3){
cin>>a>>b;
cout<<search(1,a,b)<<endl;
}
}
return 0;
}