线段树30pts,蒟蒻求调
查看原帖
线段树30pts,蒟蒻求调
1049950
cqj857699楼主2024/11/29 17:36
#include<bits/stdc++.h>
using namespace std;
int n,m,mod;
struct Node
{
	int l,r;
	long long s,tag1,tag2;
}tree[400010]; 
int a[100010];
void build(int n,int l,int r)
{
	tree[n].l=l;
	tree[n].r=r;
	tree[n].tag1=0;
	tree[n].tag2=1;
	if(l==r)
	{
		tree[n].s=a[l]%mod;
		return;
	}
	build(n*2,l,(l+r)/2);
	build(n*2+1,(l+r)/2+1,r);
	tree[n].s=(tree[n*2].s+tree[n*2+1].s)%mod;
}
void pd(int n)
{
	if(tree[n].tag1==0)
	{
		return;
	}
	int mid=(tree[n].l+tree[n].r)/2;
	tree[2*n].s=(tree[2*n].s*tree[n].tag2+tree[n].tag1*(mid-tree[n].l+1))%mod;
	tree[2*n].tag1=(tree[2*n].tag1*tree[n].tag2+tree[n].tag1)%mod;
	tree[2*n].tag2*=tree[n].tag2;
	tree[2*n].tag2%=mod;
	tree[2*n+1].s=(tree[2*n+1].s*tree[n].tag2+tree[n].tag1*(tree[n].r-mid))%mod;
	tree[2*n+1].tag1=(tree[2*n+1].tag1*tree[n].tag2+tree[n].tag1)%mod;
	tree[2*n+1].tag2*=tree[n].tag2;
	tree[2*n+1].tag2%=mod;
	tree[n].tag1=0;
	tree[n].tag2=1;
}
long long ask(int n,int l,int r)
{
	int mid=(tree[n].l+tree[n].r)/2;
	if(tree[n].l>=l&&tree[n].r<=r)
	{
		return tree[n].s;
	}
	pd(n);
	long long ans=0;
	if(mid>=l) 
	{
		ans+=ask(n*2,l,r);
		ans%=mod;
	}
	if(mid<r)
	{
		ans+=ask(n*2+1,l,r);
		ans%=mod;
	}
	return ans;
}
void add(int n,int l,int r,long long k)
{
	if(tree[n].l>=l&&tree[n].r<=r)
	{
		tree[n].s+=k*(tree[n].r-tree[n].l+1);
		tree[n].s%=mod;
		tree[n].tag1+=k;
		tree[n].tag1%=mod;
		return;
	} 
	int mid=(tree[n].l+tree[n].r)/2;
	pd(n);
	if(mid>=l)
	{
		add(n*2,l,r,k);
	}
	if(mid<r)
	{
		add(n*2+1,l,r,k);
	}
	tree[n].s=(tree[n*2].s+tree[n*2+1].s)%mod;
}
void mul(int n,int l,int r,long long k)
{
	if(tree[n].l>=l&&tree[n].r<=r)
	{
		tree[n].s=(tree[n].s*k)%mod;
		tree[n].tag1*=k;
		tree[n].tag1%=mod;
		tree[n].tag2*=k;
		tree[n].tag2%=mod;
		return;
	} 
	int mid=(tree[n].l+tree[n].r)/2;
	pd(n);
	if(mid>=l)
	{
		mul(n*2,l,r,k);
	}
	if(mid<r)
	{
		mul(n*2+1,l,r,k);
	}
	tree[n].s=(tree[n*2].s+tree[n*2+1].s)%mod;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	while(m--)
	{
		int x;
		cin>>x;
		if(x==3)
		{
			int y,z;
			cin>>y>>z;
			cout<<ask(1,y,z)<<endl;
		}
		else if(x==2)
		{
			int y,z,k;
			cin>>y>>z>>k;
			add(1,y,z,k);
		}
		else
		{
			int y,z,k;
			cin>>y>>z>>k;
			mul(1,y,z,k);
		}
	}
}
2024/11/29 17:36
加载中...