线段树求调
查看原帖
线段树求调
776799
GODTREE楼主2025/6/17 10:17
#include <bits/stdc++.h>
#define N 100005
using namespace std;
int n,q,m,a[N];
struct p
{
	int l,r,lz_a,lz_t=1,sum;
}t[N*4];
void push_down_a(int u,int ad)
{
	t[2*u].lz_a+=ad;
	t[2*u+1].lz_a+=ad;
}
void push_down_t(int u,int ti)
{
	t[2*u].lz_t=t[2*u].lz_t*ti%m;
	t[2*u+1].lz_t=t[2*u+1].lz_t*ti%m;
}
void build(int u,int l,int r)
{
	t[u].l=l,t[u].r=r;
	if (l==r)
	{
		t[u].sum=a[l];
		return ;
	} 
	int mid=(l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	t[u].sum=(t[u*2].sum+t[u*2+1].sum)%m;
	return ;
}
void add(int u,int l,int r,int ad)
{
	if(t[u].r<l||t[u].l>r) return;
	if (t[u].l>=l&&t[u].r<=r)
	{
		if (t[u].lz_t)
		{
			t[u].sum=t[u].sum*t[u].lz_t%m;
			push_down_t(u,t[u].lz_t);
			t[u].lz_t=0;
		}
		t[u].lz_a+=ad;
		return ;
	}
	add(2*u,l,r,ad);
	add(2*u+1,l,r,ad);
	t[u].sum=(t[u*2].sum+t[u*2+1].sum)%m;//更新父节点
	return ;
}
void tim(int u,int l,int r,int ti)
{
	if(t[u].r<l||t[u].l>r) return;
	if (t[u].l>=l&&t[u].r<=r)
	{
		if (t[u].lz_a)
		{
			t[u].sum=(t[u].sum+t[u].lz_a*(t[u].r-t[u].l+1))%m;
			push_down_a(u,t[u].lz_a);
			t[u].lz_a=0;
		}
		t[u].lz_t*=ti;
		return ;
	}
	tim(2*u,l,r,ti);
	tim(2*u+1,l,r,ti);
	t[u].sum=(t[u*2].sum+t[u*2+1].sum)%m;
}
int query(int u,int l,int r)
{
	if(t[u].r<l||t[u].l>r) return 0;
	if (t[u].l>=l&&t[u].r<=r)
	{
		if (t[u].lz_a)
		{
			t[u].sum=(t[u].sum+t[u].lz_a*(t[u].r-t[u].l+1))%m;
			push_down_a(u,t[u].lz_a);
			t[u].lz_a=0;
		}
		if (t[u].lz_t)
		{
			t[u].sum=t[u].sum*t[u].lz_t%m;
			push_down_t(u,t[u].lz_t);
			t[u].lz_t=0;
		}
		return t[u].sum;
	}
	return (query(u*2,l,r)%m+query(u*2+1,l,r)%m)%m;
}
int main()
{
	cin>>n>>q>>m;
	for (int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build (1,1,n);
	for (int i=1;i<=q;i++)
	{
		int opt;
		cin>>opt;
		if (opt==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			tim(1,x,y,k);
		}
		if (opt==2)
		{
			int x,y,k;
			cin>>x>>y>>k;
			add(1,x,y,k);
		}
		if (opt==3)
		{
			int x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<"\n";
		}
	}
	return 0;
}
2025/6/17 10:17
加载中...