捞 线段树模板 悬关
  • 板块学术版
  • 楼主hcy1117
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/10 16:25
  • 上次更新2024/7/10 16:39:13
查看原帖
捞 线段树模板 悬关
694969
hcy1117楼主2024/7/10 16:25

rt

题目p3373

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=400005;
int n,q,mod;
int a[100005],d[N],lzj[N],lzc[N];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
inline void cf(int b[],int x,int k)
{
	b[x]=(b[x]*k)%mod;
}
inline void jf(int b[],int x,int k)
{
	b[x]=(b[x]+k)%mod;
}
inline void build(int s,int t,int p)
{
	lzc[p]=1;
	if(s==t)
	{
		d[p]=a[s]%mod;
		return ;
	}
	int mid=s+(t-s)/2;
	build(s,mid,p*2),build(mid+1,t,p*2+1);
//	jf(d,p,d[p*2]+d[p*2+1]);
	d[p]=(d[p*2]+d[p*2+1])%mod;
}
inline void pushdown(int l,int r,int p)
{
	int mid=l+(r-l)/2;
	if(lzc[p]!=1)
	{
		cf(d,p*2,lzc[p]),cf(lzc,p*2,lzc[p]),cf(lzj,p*2,lzc[p]);
		cf(d,p*2+1,lzc[p]),cf(lzc,p*2+1,lzc[p]),cf(lzj,p*2+1,lzc[p]);
		lzc[p]=1;
	}
	if(lzj[p])
	{
		jf(d,p*2,lzj[p]*(mid-l+1)),jf(lzj,p*2,lzj[p]);
		jf(d,p*2+1,lzj[p]*(r-mid)),jf(lzj,p*2+1,lzj[p]);
		lzj[p]=0;
	}
	return ;
}
inline void cheng(int l,int r,int s,int t,int p,int k)
{
	if(l<=s&&t<=r)
	{
		cf(d,p,k),cf(lzc,p,k),cf(lzj,p,k);
		return ;
	}
	pushdown(s,t,p);
	int mid=s+(t-s)/2;
	if(l<=mid)cheng(l,r,s,mid,p*2,k);
	if(mid+1<=r)cheng(l,r,mid+1,t,p*2+1,k);
	d[p]=(d[p*2]+d[p*2+1])%mod;
}
inline void jia(int l,int r,int s,int t,int p,int k)
{
	if(l<=s&&t<=s)
	{
		jf(d,p,k*(t-s+1)),jf(lzj,p,k);
		return ;
	}
	pushdown(s,t,p);
	int mid=s+(t-s)/2;
	if(l<=mid)jia(l,r,s,mid,p*2,k);
	if(mid+1<=r)jia(l,r,mid+1,t,p*2+1,k);
	d[p]=(d[p*2]+d[p*2+1])%mod;
}
inline int getans(int l,int r,int s,int t,int p)
{
	if(l<=s&&t<=r)
	{
		return d[p]%mod;
	}
	pushdown(s,t,p);
	int mid=s+(t-s)/2;
	int sum=0;
	if(l<=mid)sum=(sum+getans(l,r,s,mid,p*2))%mod;
	if(mid+1<=r)sum=(sum+getans(l,r,mid+1,t,p*2+1))%mod;
	return sum%mod;
}
signed main()
{
	n=read(),q=read(),mod=read();
	for(int i=1;i<=n;i++)a[i]=read(),a[i]%=mod;
	build(1,n,1);
	while(q--)
	{
		int op,x,y,k;
		op=read(),x=read(),y=read();
		if(op==1)
		{
			k=read();
			cheng(x,y,1,n,1,k%mod);
		}
		else if(op==2)
		{
			k=read();
			jia(x,y,1,n,1,k%mod);
		}
		else 
		{
			write(getans(x,y,1,n,1)%mod);
			cout<<"\n";
		}
	}
}
2024/7/10 16:25
加载中...