线段树2模版求调
  • 板块灌水区
  • 楼主yhy2024
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/7/31 16:51
  • 上次更新2024/7/31 18:39:01
查看原帖
线段树2模版求调
1262406
yhy2024楼主2024/7/31 16:51

rt 题目

#include<bits/stdc++.h>
#define N 100005
using namespace std;
long long sum[N*4],sumadd[N*4],n,m,a[N*4],b,x2,y2,k2,mod,lazy[N*4];
void pushup(int k){
	sum[k]=sum[k<<1]%mod+sum[k<<1|1]%mod;
}
void build(long long k,long long l,long long r)
{
	lazy[k]=1;
	if(l==r)
	{
		sum[k]=a[l];
		return;
	}
	long long mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	pushup(k);
}
void add(long long k,long long l,long long r,long long x)
{
	sumadd[k]+=x;
	sum[k]=sum[k]+(r-l+1)*x%mod;
	return;
}
void Add(long long k,long long l,long long r,long long x)
{
	lazy[k]*=x;
	sumadd[k]*=x;
	sum[k]=sum[k]*x%mod;
	return;
}
void Pushdown(long long k,long long l,long long r,long long mid)
{
	if(lazy[k]==1)
	{
		return;
	}
	Add(k*2,l,mid,lazy[k]);
	Add(k*2+1,mid+1,r,lazy[k]);
	pushup(k);
	lazy[k]=1;
}
void pushdown(long long k,long long l,long long r,long long mid)
{
	if(sumadd[k]==0)
	{
		return;
	}
	add(k*2,l,mid,sumadd[k]);
	add(k*2+1,mid+1,r,sumadd[k]);
	pushup(k);
	sumadd[k]=0;
}
void modify(long long k,long long l,long long r,long long x,long long y,long long v)
{
//	cout<<l<<" "<<r<<endl;
	if(r<x||l>y)return;
	if(l>=x&&r<=y)
	{
		add(k,l,r,v);
		return;
	}
	int mid=(l+r)/2;
	pushdown(k,l,r,mid);
	modify(k*2,l,mid,x,y,v);
	modify(k*2+1,mid+1,r,x,y,v);
	pushup(k);
}
void Modify(long long k,long long l,long long r,long long x,long long y,long long v)
{
//	cout<<l<<" "<<r<<endl;
	if(r<x||l>y)return;
	if(l>=x&&r<=y)
	{
		Add(k,l,r,v);
		return;
	}
	int mid=(l+r)/2;
	pushdown(k,l,r,mid);
	Modify(k*2,l,mid,x,y,v);
	Modify(k*2+1,mid+1,r,x,y,v);
	pushup(k);
}
long long query(long long k,long long l,long long r,long long x,long long y)
{
	if(l>=x&&r<=y)
	{
		return sum[k];
	}
	long long mid=(l+r)/2,res=0;
	pushdown(k,l,r,mid);
	if(x<=mid)
	{
		res+=query(k*2,l,mid,x,y);
	}
	if(mid<y)
	{
		res+=query(k*2+1,mid+1,r,x,y);
	}
	return res;
}
int main()
{
	cin>>n>>m>>mod;
	for(long long i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(long long i=1;i<=m;i++)
	{
		cin>>b;
		if(b==1)
		{
			cin>>x2>>y2>>k2;
			Modify(1,1,n,x2,y2,k2);
		}
		else if(b==2)
		{
			cin>>x2>>y2>>k2;
			modify(1,1,n,x2,y2,k2);
		}
		else{
			cin>>x2>>y2;
			cout<<query(1,1,n,x2,y2)%mod<<endl;
		}
	}
	return 0;
}
2024/7/31 16:51
加载中...