大佬救命,线段树代码求调
查看原帖
大佬救命,线段树代码求调
631896
Wangtsjo楼主2022/10/3 16:06

看不出来为什么错了

输出

20

25

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
struct node{
	int l,r;ll sum;
	ll mul,add;
}t[N<<4];
int n,m,p; 
ll a[N];
inline void pd(int q){
	t[q<<1].sum=(t[q<<1].sum*t[q].mul+t[q].add*(t[q<<1].r-t[q<<1].l+1))%p;
	t[q<<1+1].sum=(t[q<<1+1].sum*t[q].mul+t[q].add*(t[q<<1+1].r-t[q<<1+1].l+1))%p;
	t[q<<1].mul=(t[q<<1].mul*t[q].mul)%p;
	t[q<<1+1].mul=(t[q<<1+1].mul*t[q].mul)%p;
	t[q<<1].add=(t[q<<1].add*t[q].mul+t[q].add)%p;
	t[q<<1+1].add=(t[q<<1+1].add*t[q].mul+t[q].add)%p;
	t[q].add=0;t[q].mul=1;
}
inline void build(int q,int l,int r){
	t[q].l=l;t[q].r=r;t[q].sum=0;t[q].add=0;t[q].mul=1;
	if(l==r) {
		t[q].sum=a[l]%p;return ;
	}
	int mid=(l+r)>>1;
	build(q<<1,l,mid);
	build(q<<1+1,mid+1,r);
	t[q].sum=(t[q<<1].sum+t[q<<1+1].sum)%p;
}
inline void upmul(int q,int l,int r,int val){
	if(t[q].l>r||t[q].r<l) return ;
	if(t[q].l>=l&&t[q].r<=r){
		t[q].add=(t[q].add*val)%p;
		t[q].mul=(t[q].mul*val)%p;
		t[q].sum=(t[q].sum*val)%p;
		return ;
	}
	pd(q);
	int mid=(t[q].l+t[q].r)>>1;
	if(l<=mid) upmul(q<<1,l,r,val);
	if(r>mid) upmul(q<<1+1,l,r,val);
	t[q].sum=(t[q<<1].sum+t[q<<1+1].sum)%p;
}
inline void upadd(int q,int l,int r,int val){
	if(t[q].l>r||t[q].r<l) return ;
	if(t[q].l>=l&&t[q].r<=r){
		t[q].add=(t[q].add+val)%p;
		t[q].sum=(t[q].sum+val*(t[q].r-t[q].l+1))%p;
		return ;
	}
	pd(q);
	int mid=(t[q].l+t[q].r)>>1;
	if(l<=mid) upadd(q<<1,l,r,val);
	if(r>mid) upadd(q<<1+1,l,r,val);
	t[q].sum=(t[q<<1].sum+t[q<<1+1].sum)%p;
}
ll query(int q,int l,int r){
	if(t[q].r<l||t[q].l>r) return 0;
	if(t[q].l>=l&&t[q].r<=r){
		return t[q].sum;
	}
	pd(q);
	ll val=0;
	int mid=(t[q].l+t[q].r)>>1;
	if(l<=mid) val+=query(q<<1,l,r);
	if(r>mid) val+=query(q<<1+1,l,r);
	return val;	
}
int main(){
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int ch,x,y,k;
		scanf("%d",&ch);
		if(ch==1) scanf("%d%d%d",&x,&y,&k),upmul(1,x,y,k);
		else if(ch==2) scanf("%d%d%d",&x,&y,&k),upadd(1,x,y,k);
		else if(ch==3) {
			scanf("%d%d",&x,&y);
			ll ans=query(1,x,y)%p;
			printf("%lld\n",ans);
		}
	}
	return 0;
}
2022/10/3 16:06
加载中...