RT,感觉可能爆long long 了,但是查不出来错,感谢各位点进来的大佬
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int Max_N=100005;
ll n,m,mod,belong[Max_N],l[Max_N],r[Max_N];
ll block,num,add[Max_N],mul[Max_N],sum[Max_N],a[Max_N];
inline void down (int p) {
for (register int i=l[p];i<=r[p];i++) {
a[i]*=mul[p],a[i]+=add[p],a[i]%=mod;
}
sum[p]%=mod;
mul[p]=1,add[p]=0;
return ;
}
inline void build () {
block=sqrt(n);
num=n/block;
if (n%block) num++;
for (register int i=1;i<=n;i++) {
belong[i]=(i-1)/block+1;
sum[belong[i]]+=a[i];
}
for (register int i=1;i<=num;i++) {
l[i]=(i-1)*block+1;
r[i]=i*block;
mul[i]=1;
sum[belong[i]]%=mod;
}
r[num]=n;
return ;
}
inline void Mul (int x,int y,int c) {
if (belong[x]==belong[y]) {
down(belong[x]);
for (register int i=x;i<=y;i++) {
sum[belong[i]]+=(c-1)*a[i]%mod;
a[i]*=c;
}
return ;
}else{
down(belong[x]);
down(belong[y]);
for (register int i=x;i<=r[belong[x]];i++) {
sum[belong[i]]+=(c-1)*a[i]%mod;
a[i]*=c;
}
for (register int i=belong[x]+1;i<belong[y];i++) {
mul[i]*=c,mul[i]%=mod;
add[i]*=c,add[i]%=mod;
sum[i]*=c,sum[i]%=mod;
}
for (register int i=l[belong[y]];i<=y;i++) {
sum[belong[i]]+=(c-1)*a[i]%mod;
a[i]*=c;
}
return ;
}
}
inline void Add (int x,int y,int c) {
if (belong[x]==belong[y]) {
down(belong[x]);
sum[belong[x]]+=(y-x+1)*c%mod;
sum[belong[x]]%=mod;
for (register int i=x;i<=y;i++) {
a[i]+=c;
}
return ;
}else{
down(belong[x]);
down(belong[y]);
sum[belong[x]]+=(r[belong[x]]-x+1)*c%mod;
sum[belong[x]]%=mod;
for (register int i=x;i<=r[belong[x]];i++) {
a[i]+=c;
}
for (register int i=belong[x]+1;i<belong[y];i++) {
add[i]+=c,add[i]%=mod;
sum[i]+=block*c,sum[i]%=mod;
}
sum[belong[y]]+=(y-l[belong[y]]+1)*c%mod;
sum[belong[y]]%=mod;
for (register int i=l[belong[y]];i<=y;i++) {
a[i]+=c;
}
return ;
}
}
inline void query (int x,int y) {
ll ans=0;
if (belong[x]==belong[y]) {
for (register int i=x;i<=y;i++) {
ans+=a[i]*mul[belong[i]]%mod+add[belong[i]];
ans%=mod;
}
cout<<ans<<'\n';
return ;
}else{
for (register int i=x;i<=r[belong[x]];i++) {
ans+=a[i]*mul[belong[i]]+add[belong[i]];
ans%=mod;
}
for (register int i=belong[x]+1;i<belong[y];i++) {
ans+=sum[i];
ans%=mod;
}
for (register int i=l[belong[y]];i<=y;i++) {
ans+=a[i]*mul[belong[i]]+add[belong[i]];
ans%=mod;
}
cout<<ans<<'\n';
return ;
}
}
signed main () {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>mod;
for (register int i=1;i<=n;i++) {
cin>>a[i];
}
build();
cin>>m;
while (m--) {
int op,t,g,c;
cin>>op>>t>>g;
if (op==1) {
cin>>c;
Mul(t,g,c);
}
if (op==2) {
cin>>c;
Add(t,g,c);
}
if (op==3) {
query(t,g);
}
}
}