线段树板子,3个RE,求救
查看原帖
线段树板子,3个RE,求救
219935
JeffWang2019楼主2020/7/23 17:43

是我数组开小了吗,还是哪里错了?

#include <bits/stdc++.h>
#define int long long
#define ls(x) (x<<1ll)
#define rs(x) (x<<1ll|1)
using namespace std;
int a[100001],sum[100001<<1ll];
int n,m,p,op,x,y,k;
inline void pushup(int x)
{
	sum[x]=(sum[ls(x)]+sum[rs(x)])%p;
}
void build(int x,int l,int r)
{
	if(l==r)
	{
		sum[x]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	pushup(x);
	return;
}
void update(int l,int r,int x,int nl,int nr,int k)
{
	if(nl>r||nr<l)
	{
		return;
	} 
	if(nl==nr)
	{
		sum[x]=(sum[x]+k)%p;
		return;
	}
	int mid=(nl+nr)>>1;
	update(l,r,ls(x),nl,mid,k);
	update(l,r,rs(x),mid+1,nr,k);
	pushup(x);
	return;
}
void update2(int l,int r,int x,int nl,int nr,int k)
{
	if(nl>r||nr<l)
	{
		return;
	}
	if(nl==nr)
	{
		sum[x]=sum[x]*k%p;
		return;
	}
	int mid=(nl+nr)>>1;
	update2(l,r,ls(x),nl,mid,k);
	update2(l,r,rs(x),mid+1,nr,k);
	pushup(x);
	return;
}
int query(int l,int r,int x,int nl,int nr)
{
	if(nl>r||nr<l)
	{
		return 0;
	}
	if(nl>=l&&nr<=r)
	{
		return sum[x];
	}
	int mid=(nl+nr)>>1;
	return (query(l,r,ls(x),nl,mid)+query(l,r,rs(x),mid+1,nr))%p;
}
#undef int
int main()
{
	#define int long long
	scanf("%lld%lld%lld",&n,&m,&p);
	for(int i=1;i<=n;++i)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for(int j=0;j<m;++j)
	{
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op!=3)
		{
			scanf("%lld",&k);
		}
		if(op==1)
		{ 
			update2(x,y,1,1,n,k);
		} 
		else if(op==2)
		{ 
			update(x,y,1,1,n,k);
		} 
		else
		{ 
			printf("%lld\n",query(x,y,1,1,n));
		} 
	}
	return 0;
}
2020/7/23 17:43
加载中...