求调,线段树莫名RE
查看原帖
求调,线段树莫名RE
363144
zljhenry楼主2022/10/20 23:35
#include<bits/stdc++.h>
using namespace std;
#define M 1000005

#define int long long
#define ll long long
struct node {
	int mlz,plz,l,r,sum;
}tr[M];
int a[M],n,m,p;

void build(int i,int l,int r){
	tr[i].l=l;tr[i].r=r;
	tr[i].mlz=1;
	if(l==r){
		tr[i].sum=a[l]%p;
		return;
	}
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	tr[i].sum=(tr[i<<1].sum+tr[i<<1|1].sum)%p;
}
void push_down(int i){
	int k1=tr[i].mlz,k2=tr[i].plz;
	tr[i<<1].sum=(ll)(tr[i<<1].sum*k1+k2*(tr[i<<1].r-tr[i<<1].l+1))%p;
	tr[i<<1|1].sum=(ll)(tr[i<<1|1].sum*k1+k2*(tr[i<<1|1].r-tr[i<<1|1].l+1))%p;
	tr[i<<1].mlz=(ll)(tr[i<<1].mlz*k1)%p;
	tr[i<<1|1].mlz=(ll)(tr[i<<1|1].mlz*k1)%p;
	tr[i<<1].plz=(ll)(tr[i<<1].plz*k1+k2)%p;
	tr[i<<1|1].plz=(ll)(tr[i<<1|1].plz*k1+k2)%p;
	tr[i].plz=0;tr[i].mlz=1;
}
void add(int i,int l,int r,int k){
	if(tr[i].r<=r&&tr[i].l>=l){
		tr[i].plz=(ll)(tr[i].plz+k)%p;
		tr[i].sum=(ll)(tr[i].sum+k*(tr[i].r-tr[i].l+1))%p;
		return;
	}
	push_down(i);
	if(tr[i<<1].r>=l) add(i<<1,l,r,k);
	if(tr[i<<1|1].l<=r) add(i<<1|1,l,r,k);
	tr[i].sum=(tr[i<<1].sum+tr[i<<1|1].sum)%p;
	// return;	
}
void mult(int i,int l,int r,int k){
	if(tr[i].l>=l&&tr[i].r<=r){
		tr[i].mlz=(tr[i].mlz*k)%p;
		tr[i].plz=(tr[i].plz*k)%p;
		tr[i].sum=(tr[i].sum*k)%p;
		return;
	}
	push_down(i);
	if(tr[i<<1].r>=l) mult(i<<1,l,r,k);
	if(tr[i<<1|1].l<=r) mult(i<<1|1,l,r,k);
	tr[i].sum=(tr[i<<1].sum+tr[i<<1|1].sum)%p;
}
int search(int i,int l,int r){
	if(tr[i].l>=l&&tr[i].r<=r)
		return tr[i].sum;
	push_down(i);
	int s=0;
	if(tr[i<<1].r>=l) s=(s+search(i<<1,l,r))%p;
	if(tr[i<<1|1].l<=r) s=(s+search(i<<1|1,l,r))%p;
	return s;
}


signed main(){
	scanf("%lld%lld%lld",&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 opt;scanf("%lld",opt);
		if(opt==1){
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			mult(1,x,y,k);
		}else if(opt==2){
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			add(1,x,y,k);
		}else{
			int x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",search(1,x,y));
		}
	}
	return 0;
}
2022/10/20 23:35
加载中...