萌新求调QAQ改了好几天都没过
查看原帖
萌新求调QAQ改了好几天都没过
1017763
FHJISADOG楼主2023/6/11 14:52
#include<bits/stdc++.h>
using namespace std;
using i64=long long;
const int N=4e6+1;
i64 a[100001];
int mod;
struct fenwicktree
{
	i64 l,r;
	i64 sum,add,multi;
}sgt[N];
void updata(int k)
{
	sgt[k].sum=(sgt[k+k].sum  *sgt[k+k].multi  +sgt[k+k].add  *(sgt[k+k].r  -sgt[k+k].l  +1))%mod
	          +(sgt[k+k+1].sum*sgt[k+k+1].multi+sgt[k+k+1].add*(sgt[k+k+1].r-sgt[k+k+1].l+1))%mod;
}
void push_down(int k)
{
	int l=sgt[k].l;
	int r=sgt[k].r;
	if(sgt[k].multi)
	{
		sgt[k].sum=(sgt[k].sum*sgt[k].multi)%mod;
		sgt[k+k].multi=(sgt[k+k].multi*sgt[k].multi)%mod;
		sgt[k+k+1].multi=(sgt[k+k+1].multi*sgt[k].multi)%mod;
		sgt[k+k].add=(sgt[k+k].add*sgt[k].multi)%mod;
		sgt[k+k+1].add=(sgt[k+k+1].add*sgt[k].multi)%mod;
		sgt[k].multi=1;
	}
	if(sgt[k].add)
	{
		sgt[k].sum=(sgt[k].sum+(r-l+1)*sgt[k].add)%mod;
		sgt[k+k].add=(sgt[k+k].add+sgt[k].add)%mod;
		sgt[k+k+1].add=(sgt[k+k+1].add+sgt[k].add)%mod;
		sgt[k].add=0;
	}
}
void build(int k,int l,int r)
{
	sgt[k].add=0;
	sgt[k].multi=1;
	sgt[k].l=l;
	sgt[k].r=r;
	if(l==r)
	{
		sgt[k].sum=a[l];
		return ;
	}
	int m=(l+r)>>1;
	build(k+k,l,m);
	build(k+k+1,m+1,r);
	sgt[k].sum=(sgt[k+k].sum+sgt[k+k+1].sum)%mod;
}
void add(int k,int x,int y,i64 p)
{
	int l=sgt[k].l;
	int r=sgt[k].r;
	if(l==x&&r==y)
	{
		sgt[k].add+=p%mod;
		return ;
	}
	push_down(k);
	int m=(l+r)>>1;
	if(y<=m)
	    add(k+k,x,y,p);
	else if(m<x)
		add(k+k+1,x,y,p);
	else
		add(k+k,x,m,p),add(k+k+1,m+1,y,p);
	updata(k);
}
void multi(int k,int x,int y,i64 p)
{
	int l=sgt[k].l;
	int r=sgt[k].r;
	if(l==x&&r==y)
	{
		sgt[k].multi=sgt[k].multi*p%mod;
		sgt[k].add=sgt[k].add*p%mod;
		return ;
	}
	push_down(k);
	int m=(l+r)>>1;
	if(y<=m)
	    multi(k+k,x,y,p);
	else if(m<x)
		multi(k+k+1,x,y,p);
	else
		multi(k+k,x,m,p),multi(k+k+1,m+1,y,p);
	updata(k);
}
i64 calc(int k,int x,int y)
{
	int l=sgt[k].l;
	int r=sgt[k].r;
	if(l==x&&r==y)
	{
		return (sgt[k].sum*sgt[k].multi%mod+sgt[k].add*(r-l+1))%mod;
	}
	push_down(k);
	int m=(l+r)>>1;
	if(m>=y)
	    return calc(k+k,x,y);
	else if(m<x)
		return calc(k+k+1,x,y);
	else
		return calc(k+k,x,m)+calc(k+k+1,m+1,y);
}
signed main()
{
	int n,m;
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(int i=0;i<m;i++)
	{
		int x;
		cin>>x;
		if(x==1)
		{
			i64 x,y,z;
			cin>>x>>y>>z;
			multi(1,x,y,z);
		}
		else if(x==2)
		{
			i64 x,y,z;
			cin>>x>>y>>z;
			add(1,x,y,z);
		}
		else
		{
			i64 x,y;
			cin>>x>>y;
			cout<<calc(1,x,y)%mod<<endl;
		}
	}
}
2023/6/11 14:52
加载中...