线段树模板0pts求条
查看原帖
线段树模板0pts求条
1419446
封禁用户楼主2024/10/25 09:31

rt,怀疑是push_down出了问题

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,q,mod;
int a[N],t[N<<2],d[N<<2],c[N<<2];
void build(int p,int l,int r)
{
	c[p]=1;
	if(l==r)
	{
		t[p]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	t[p]=t[p<<1]+t[p<<1|1];
	t[p]%=mod;
}
void push_down(int p,int l,int r)
{
	int ls=p<<1,rs=p<<1|1,mid=(l+r)>>1;
	d[ls]+=d[p];d[rs]+=d[p];
	t[ls]+=(mid-l+1)*d[p];
	t[rs]+=(r-mid)*d[p];
	d[p]=0;
	d[ls]%=mod;d[rs]%=mod;
	t[ls]%=mod;t[rs]%=mod;
	c[ls]*=c[p];c[rs]*=c[p];
	t[ls]*=c[p];t[rs]*=c[p];
	c[p]=1;
	c[ls]%=mod;c[rs]%=mod;
	t[ls]%=mod;t[rs]%=mod;
}
int query(int p,int l,int r,int nl,int nr)
{
	if(l<=nl&&nr<=r)return t[p];
	push_down(p,nl,nr);
	int mid=(nl+nr)>>1,res=0;
	if(l<=mid)res=query(p<<1,l,r,nl,mid);
	if(mid<r)res+=query(p<<1|1,l,r,mid+1,nr);
	res%=mod;
	return res;
}
void update(int p,int l,int r,int nl,int nr,int x)
{
	push_down(p,nl,nr);
	if(l<=nl&&nr<=r)
	{
		d[p]+=x;
		t[p]+=(nr-nl+1)*x;
		d[p]%=mod;
		t[p]%=mod;
		return;
	}
	int mid=(nl+nr)>>1;
	if(l<=mid)update(p<<1,l,r,nl,mid,x);
	if(mid<r)update(p<<1|1,l,r,mid+1,nr,x);
	t[p]=t[p<<1]+t[p<<1|1];t[p]%=mod;
}
void modify(int p,int l,int r,int nl,int nr,int x)
{
	push_down(p,nl,nr);
	if(l<=nl&&nr<=r)
	{
		d[p]*=x;d[p]%=mod;
		t[p]*=x;t[p]%=mod;
		return;
	}
	int mid=(nl+nr)>>1;
	if(l<=mid)modify(p<<1,l,r,nl,mid,x);
	if(mid<r)modify(p<<1|1,l,r,mid+1,nr,x);
	t[p]=t[p<<1]+t[p<<1|1];t[p]%=mod;
}
signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>q>>mod;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(q--)
	{
		int op;cin>>op;
		if(op==3)
		{
			int l,r;cin>>l>>r;
			cout<<query(1,l,r,1,n)<<'\n';
		}
		else if(op==2)
		{
			int l,r,x;cin>>l>>r>>x;
			update(1,l,r,1,n,x);
		}
		else{
			int l,r,x;cin>>l>>r>>x;
			modify(1,l,r,1,n,x);
		}
	}
	return 0;
}
2024/10/25 09:31
加载中...