0分求助
查看原帖
0分求助
616521
L_DAO_QING楼主2022/4/24 13:43

样例都过不去,我实在找不到问题在哪,那个大佬帮忙看看

#include <bits/stdc++.h>
#define zz p*2  
#define yz p*2+1
using namespace std;
long long n,m,mo,a[10000000];
struct tree{
	long long l,r,w,j,c;//左,右,值,加tag,乘tag 
};
tree t[10000000];
void build(int p,int l,int r){
	t[p].l=l;t[p].r=r;t[p].c=1;
	if(l==r){
		t[p].w=a[l]%mo;return;
	}
	build(zz,l,(l+r)/2);
	build(yz,(l+r)/2+1,r);
	t[p].w=(t[zz].w+t[yz].w)%mo;
}
void down(int p){
	t[zz].c=(t[p].c*t[zz].c)%mo;
	t[yz].c=(t[p].c*t[yz].c)%mo;
	t[zz].j=(t[p].c*t[zz].j+t[p].j)%mo;
	t[yz].j=(t[p].c*t[yz].j+t[p].j)%mo;
	t[zz].w=(t[p].c*t[zz].w+t[p].j*(t[zz].r-t[zz].l+1))%mo;
	t[yz].w=(t[p].c*t[yz].w+t[p].j*(t[yz].r-t[yz].l+1))%mo;
	t[p].j=0;t[p].c=1;
}
void add(int p,int l,int r,int k){
	if(t[p].l>r||t[p].r<l) return;
	if(t[p].l>=l&&t[p].r<=r){
		t[p].j=(k+t[p].j)%mo;
		t[p].w=(k*(t[p].r-t[p].l+1)+t[p].w)%mo;
		return;
	}
	down(p);
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) add(zz,l,r,k);
	if(r>mid) add(yz,l,r,k);
	t[p].w=(t[zz].w+t[yz].w)%mo;
}
void ch(int p,int l,int r,int k){
	if(t[p].l>r||t[p].r<l) return;
	if(t[p].l>=l&&t[p].r<=r){
		t[p].c=(k*t[p].c)%mo;
		t[p].j=(k*t[p].j)%mo;
		t[p].w=(k*t[p].w)%mo;
		return;
	}
	down(p);
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) ch(zz,l,r,k);
	if(r>mid) ch(yz,l,r,k);
	t[p].w=(t[zz].w+t[yz].w)%mo;
}
long long check(int p,int l,int r){
	if(t[p].l>r||t[p].r<l) return 0;
	if(t[p].l>=l&&t[p].r<=r) return t[p].w;
	down(p);
	long long an=0;
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) an=(check(zz,l,r)+an)%mo;
	if(r<mid) an=(check(yz,l,r)+an)%mo;
	return an;
}
int main(){
	cin>>n>>m>>mo;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int b,x,y,z;
		cin>>b;
		if(b==1){
			cin>>x>>y>>z;
			ch(1,x,y,z);
		}
		if(b==2){
			cin>>x>>y>>z;
			add(1,x,y,z);
		}
		if(b==3){
			cin>>x>>y;
			cout<<check(1,x,y)<<endl;
		}
	}
	return 0;
} 
2022/4/24 13:43
加载中...