R.T.
这是问题代码,但是我没有调试出来,请求你的帮助!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <deque>
#include <cctype>
#include <cstdlib>
#include <iomanip>
using namespace std;
const int maxn=1e5;
using ll=long long;
ll st[4*maxn+10],lz[4*maxn+10],lz2[4*maxn+10];/*lz[i]是乘法标记,lz2是加法标记*/
ll m,n,p,a[maxn+10];
ll lRd()
{
ll res=0,f=1;
char c=getchar();
while(!isdigit(c)) {
if(c=='-') {
f=-1;
}
c=getchar();
}
while(isdigit(c)) {
res=(res<<1)+(res<<3)+c-'0';
c=getchar();
}
return res*f;
}
void PushUp(int k)
{
st[k]=(st[k<<1]+st[k<<1|1])%p;
}
void Chge(int l,int r,int k,int v,int op)
{
/*乘法*/
if(op==1) {
lz[k]=(lz[k]*v%p)%p;
st[k]=(st[k]*v%p)%p;
} else {//+加法
if(op==2) {
lz2[k]=(lz2[k]+v%p)%p;
/**/
st[k]=(st[k]+(v%p*(r-l+1)%p)%p)%p;
}
}
}
void PushDown(int l,int r,int k)
{
if(lz[k]>1) {
Chge(l,r,k<<1,lz[k],1) ;
Chge(l,r,k<<1|1,lz[k],1);
lz[k]=1;
}
if(lz2[k]) {
/**/
Chge(l,r,k<<1,lz2[k],2);
Chge(l,r,k<<1|1,lz2[k],2);
lz2[k]=0;
}
}
void Bd(int l,int r,int k)
{
if(l==r) {
st[k]=a[l];
return;
}
int mid=l+(r-l>>1);
Bd(l,mid,k<<1);
Bd(mid+1,r,k<<1|1);
PushUp(k);
}
void Upd(int l,int r,int k,int x,int y,int v,int op,int step)
{
if(l>=x&&r<=y) {
Chge(l,r,k,v,op);
return;
}
PushDown(l,r,k);
int mid=l+(r-l>>1);
if(x<=mid) {
Upd(l,mid,k<<1,x,y,v,op,1+step);
}
if(y>mid) {
Upd(mid+1,r,k<<1|1,x,y,v,op,step+1);
}
PushUp(k);
}
ll Fd(int l,int r,int k,int x,int y,int step)
{
if(l>=x&&r<=y) {
return st[k];
}
PushDown(l,r,k);
ll res=0,res2=0;
int mid=l+(r-l>>1);
if(x<=mid) {
res=(res+Fd(l,mid,k<<1,x,y,step+1)%p)%p;printf("结点%d的左子树返回%lld\n",k,res);
}
if(y>mid) {
res2=(Fd(mid+1,r,k<<1|1,x,y,step+1)%p)%p;printf("结点%d的右子树返回%lld\n",k,res2);
}
return (res+res2)%p;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&p);
for(int i=1; i<=n; ++i) {
a[i]=lRd();
}
Bd(1,n,1);
/*初始化lz[i]=1*/
for(int i=1; i<=4*n; ++i) {
lz[i]=1;
}
for(int i=1; i<=m; ++i) {
int op,x,y,v;
op=lRd(),x=lRd(),y=lRd();
if(op!=3) {
v=lRd();
Upd(1,n,1,x,y,v,op,1);
} else {
printf("%lld\n",Fd(1,n,1,x,y,1));
}
}
return 0;
}