线段树2 求调
  • 板块学术版
  • 楼主lizeqi1127
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/25 18:24
  • 上次更新2024/11/25 20:23:28
查看原帖
线段树2 求调
842626
lizeqi1127楼主2024/11/25 18:24
#include <bits/stdc++.h>
#define int long long
using namespace std;
long long a[1000086];
long long b[1000086];
long long bj[1000086];
long long bj2[1000086];
long long numm;
void build(int i, int l, int r) {
	if (l == r) {
	b[i] = a[l];
	return;
	}
	int mid = (l + r) / 2;
	build(i * 2, l, mid);
	build(i * 2 + 1, mid + 1, r);
	b[i] = b[i * 2] + b[i * 2 + 1];
	b[i]%numm;
	return;
}
void push_down2(int i,int l,int r,bool flag);
void push_down(int i,int l,int r,bool flag)
{
	if(bj[i]==0) return;
	int mid=(l+r)/2;
	int k=bj[i];
	if(flag==0)
	{
		push_down2(i*2,l,mid,1);
		push_down2(i*2+1,mid+1,r,1);
	}
	b[i*2]+=k*(mid-l+1);
	bj[i*2]+=bj[i]; 
	b[i*2+1]+=k*(r-mid);
	bj[i*2+1]+=bj[i];
	bj[i]=0;
	b[i*2]%=numm;
	b[i*2+1]%=numm;
	return;
}
void push_down2(int i,int l,int r,bool flag)//乘法
{
	if(bj2[i]==1) return;
	int mid=(l+r)/2;
	int k=bj2[i];
	k%=numm;
	if(flag==0)
	{
		push_down(i*2,l,mid,1);
		push_down(i*2+1,mid+1,r,1);
	}
	b[i*2]*=k;
	bj2[i*2]*=bj2[i];
	b[i*2]%=numm;
	b[i*2+1]*=k;
	bj2[i*2+1]*=bj2[i];
	b[i*2+1]%=numm;
	bj2[i]=1;
	return;
}
void add(int i,int l,int r,int nl,int nr,long long k)
{
	push_down2(i,l,r,0);
	if(l>=nl&&r<=nr)
	{
		bj[i]+=k;
		b[i]+=k*(r-l+1);
		b[i]%=numm;
		return;
	}
	else
	{
	 	push_down(i,l,r,0);
	 	int mid=(l+r)/2;
	 	if(nl<=mid) add(i*2,l,mid,nl,nr,k);
	 	if(nr>mid) add(i*2+1,mid+1,r,nl,nr,k);
	 	b[i]=b[i*2+1]+b[i*2];
	 	b[i]%=numm;
	}
	return;
}
void mul(int i,int l,int r,int nl,int nr,long long k)
{
	push_down(i,l,r,0);
	if(l>=nl&&r<=nr)
	{
		k%=numm;
		bj2[i]*=k;
		b[i]*=k;
		b[i]%=numm;
		return;
	}
	else
	{
	 	push_down2(i,l,r,0);
	 	int mid=(l+r)/2;
	 	if(nl<=mid) mul(i*2,l,mid,nl,nr,k);
	 	if(nr>mid) mul(i*2+1,mid+1,r,nl,nr,k);
	 	b[i]=b[i*2+1]+b[i*2];
	 	b[i]%=numm;
	}
	return;
}
long long sum(int i,int l,int r,int nl,int nr)
{
	
	long long ssum=0;
	if(r<=nr&&l>=nl)
	{
		return b[i]%numm;
	}
	push_down2(i,l,r,0);
	push_down(i,l,r,0);
	int mid=(l+r)/2;
	if(nl<=mid) ssum+=sum(i*2,l,mid,nl,nr),ssum%=numm;
	if(nr>mid) ssum+=sum(i*2+1,mid+1,r,nl,nr),ssum%=numm;
	return ssum;
}
signed main() {

	int n,m;
	cin>>n>>m>>numm;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		bj2[i]=1;
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			long long x,y,z;
			cin>>x>>y>>z;
			mul(1,1,n,x,y,z);
		}
		if(op==2)
		{
			long long x,y,z;
			cin>>x>>y>>z;
			add(1,1,n,x,y,z);
		}
		if(op==3)
		{
			int x,y;
			cin>>x>>y;
			//for(int i=1;i<=n*2;i++)
			//{
			//	cout<<b[i]<<" ";
			//}
			//cout<<endl;
			cout<<sum(1,1,n,x,y)%numm<<endl;
		}
	}
	return 0;
}
2024/11/25 18:24
加载中...