这题疑似用高精?
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
ll n,m,mod,op,x,y,z,a[100005],d[400005],tagj[400005],tagc[400005];
void build(ll x,ll y,ll z){
tagc[z]=1;
if(x==y){
d[z]=a[x];
return ;
}
int q=(x+y)/2;
build(x,q,z*2);
build(q+1,y,z*2+1);
d[z]=d[z*2]+d[z*2+1];
}
inline void push(ll x,ll y,ll id){
ll q=(x+y)/2;
if(tagc[id]!=1){
tagc[id*2+1]=(tagc[id*2+1]*tagc[id])%mod;
tagc[id*2]=(tagc[id*2]*tagc[id])%mod;
tagj[id*2+1]=(tagj[id*2+1]*tagc[id])%mod;
tagj[id*2]=(tagj[id*2]*tagc[id])%mod;
d[id*2+1]=(d[id*2+1]*tagc[id])%mod;
d[id*2]=(d[id*2]*tagc[id])%mod;
tagc[id]=1;
}
if(tagj[id]!=0){
tagj[id*2+1]=(tagj[id*2+1]+tagj[id])%mod;
tagj[id*2]=(tagj[id*2]+tagj[id])%mod;
d[id*2]=(d[id*2]+tagj[id]*(q-x+1))%mod;
d[id*2+1]=(d[id*2+1]+tagj[id]*(y-q))%mod;
tagj[id]=0;
}
return ;
}
void updatej(ll l,ll r,ll al,ll ar,ll x,ll id){
int q=(al+ar)/2;
if(l<=al&&ar<=r){
d[id]=(d[id]+x*(ar-al+1))%mod;
tagj[id]=(tagj[id]+x)%mod;
return ;
}
push(al,ar,id);
if(q>=l) updatej(l,r,al,q,x,id*2);
if(q+1<=r) updatej(l,r,q+1,ar,x,id*2+1);
d[id]=d[id*2]+d[id*2+1];
}
void updatec(ll l,ll r,ll al,ll ar,ll z,ll id){
int q=(al+ar)/2;
if(l<=al&&ar<=r){
d[id]=(d[id]*z)%mod;
tagj[id]=(tagj[id]*z)%mod;
tagc[id]=(tagc[id]*z)%mod;
return ;
}
push(al,ar,id);
if(q>=l) updatec(l,r,al,q,z,id*2);
if(q+1<=r) updatec(l,r,q+1,ar,z,id*2+1);
d[id]=d[id*2]+d[id*2+1];
}
ll query(ll l,ll r,ll al,ll ar,ll id){
if(l<=al&&r>=ar){
return d[id];
}
ll q=(al+ar)/2,sum=0;
push(al,ar,id);
if(q>=l) sum=(sum+query(l,r,al,q,id*2))%mod;
if(q+1<=r) sum=(sum+query(l,r,q+1,ar,id*2+1))%mod;
return sum;
}
int main(){
cin >>n>>mod;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin >>m;
build(1,n,1);
while(m--){
cin >>op;
if(op==1){
cin >>x>>y>>z;
updatec(x,y,1,n,z,1);
}
if(op==2){
cin >>x>>y>>z;
updatej(x,y,1,n,z,1);
}
if(op==3){
cin >>x>>y;
cout <<query(x,y,1,n,1)<<endl;;
}
}
return 0;
}
线段树2板子搬过来改了下
long long 60 unsigned long long 80