求大哥调一下线段树!!!!
查看原帖
求大哥调一下线段树!!!!
754658
haha_hua楼主2022/11/25 18:57

只有30分...

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,mod,val[100005],dj[500005],dc[500005],a[500005];
char ch;
// dj[] 为lazy加法,dc[]为lazy乘法
ll read(){
	ll s = 0, w = 1;
	ch = getchar();
	while(ch < '0' || ch > '9')
	{
		if(ch == '-') w = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')
	{
		s = s * 10 + ch - '0';
		ch = getchar();
	}
	return s * w;
}

void jia(ll x,ll l,ll r,ll z){
	dj[x] += z;
	a[x] += z*(r - l + 1);
	return ;
}

void cheng(ll x,ll z){
	dj[x] *= z;
	dc[x] *= z;
	a[x] *= z;
	return ;
}

void build(ll x,ll l,ll r){
	
	dc[x] = 1;
	dj[x] = 0;
	if(l == r)
	{
		a[x] = val[l];
		return ;
	}
	
	ll mid = (l + r) / 2;
	build(2*x,l,mid);
	build(2*x+1,mid+1,r);
	a[x] = a[2*x] + a[2*x+1];
	return ;
}

void pushdown(ll x,ll l,ll r,ll mid){

	if(dc[x] != 1)
	{
		cheng(2*x,dc[x]);
		cheng(2*x+1,dc[x]);
		dc[x] = 1;
	}
	if(dj[x] != 0)
		{
			jia(2*x,l,mid,dj[x]);
			jia(2*x+1,mid+1,r,dj[x]);
			dj[x] = 0;
		}
	return ;
}

void xiug(ll x,ll l,ll r,ll el,ll er,ll z,ll p){

	if(l == el && r == er)
	{
		if(p == 1)
		{
			cheng(x,z);
		}else{
			jia(x,l,r,z);
		}
		return ;
	}
	
	ll mid = (l + r) / 2;
	pushdown(x,l,r,mid);
	if(el <= mid && er > mid)
	{
		xiug(2*x,l,mid,el,mid,z,p);
		xiug(2*x+1,mid+1,r,mid+1,er,z,p);
	} else if(er <= mid)
	{
		xiug(2*x,l,mid,el,er,z,p);
	}else
	{
		xiug(2*x+1,mid+1,r,el,er,z,p);
	}
	a[x] = a[2*x] % mod + a[2*x+1] % mod; 
	return ;
}

ll chax(ll x,ll l,ll r,ll el,ll er){
	
	if(l == el && r == er)
	{
		return a[x] % mod;
	}
	
	ll mid = (l + r) / 2;
	pushdown(x,l,r,mid);
	if(el <= mid && er > mid)
	{
		return (chax(2*x,l,mid,el,mid) + chax(2*x+1,mid+1,r,mid+1,er)) % mod;
	}else if(er <= mid)
	{
		return chax(2*x,l,mid,el,er);
	}else
	{
		return chax(2*x+1,mid+1,r,el,er);
	}
	
}

int main(){
	
	cin >> n >> m >> mod;
	for(int i = 1; i <= n; i++)
	{
		val[i] = read();
	}
	build(1,1,n);
	
	ll l,r,p;
	while(m--)
	{
		p = read();
		if(p == 1)
		{
			l = read(),r = read(),p = read();
			xiug(1,1,n,l,r,p,1);
		} else if(p == 2)
		{
			l = read(),r = read(),p = read();
			xiug(1,1,n,l,r,p,2);
		}else
		{
			l = read(),r = read();
			printf("%lld\n",chax(1,1,n,l,r) % mod);
		}
	}
	
	return 0;
}











2022/11/25 18:57
加载中...