切45min,线段树还没过……
查看原帖
切45min,线段树还没过……
773747
yutong_Seafloor楼主2023/10/12 18:04

赏一关,爆零

#include<bits/stdc++.h>
using namespace std;
struct node
{
	long long sum,add,num;
	int l,r;
}tr[400040];
long long n,m,k,i,mod,t,q,op,j,x,y,a[100010];
bool pd;
void modd(int id)
{
	tr[id].sum=(tr[id<<1].sum*tr[id<<1|1].sum)%mod;
	return ; 
}
void build(int id,int x,int y)
{
	tr[id].l=x,tr[id].r=y,tr[id].num=1;
	if(x==y)
	{
		tr[id].sum=a[x]%mod;
		return ;
	}
	int mid=(x+y)>>1;
	build(id<<1,x,mid);
	build(id<<1|1,mid+1,y);
	modd(id);
	return ;
}
void wh(int id)
{
	tr[id<<1].sum=(tr[id<< 1].sum * tr[id].num + tr[id].add * (tr[id << 1].r-tr[id << 1].l + 1)) % mod;
	tr[id<<1|1].sum=(tr[id<< 1 | 1].sum *tr[id].num+tr[id].add *(tr[id<<1 | 1].r - tr[id << 1 | 1].l + 1)) % mod;
	tr[id <<1].num = (tr[id << 1].num * tr[id].num) % mod;
	tr[id<<1|1].num = (tr[id << 1 | 1].num * tr[id].num) % mod;
	tr[id<<1].add = (tr[id << 1].add * tr[id].num + tr[id].add) % mod;
	tr[id<<1|1].add = (tr[id << 1 | 1].add * tr[id].num + tr[id].add) % mod;
	tr[id].add=0;
	tr[id].num=1;
	return ; 
}
  void xf(int id,int x,int y,int zax)
{
	if(x<=tr[id].l && tr[id].r<=y)
	{
		tr[id].add=(tr[id].add*zax)%mod;
		tr[id].num=(tr[id].num*zax)%mod;
		tr[id].sum=(tr[id].sum*zax)%mod;
		return ;
	}
	wh(id);
	int mid=(tr[id].l+tr[id].r)/2;
	if(x<=mid) xf(id<<1,x,y,zax);
	else xf(id<<1|1,x,y,zax);
	modd(id);
	return ;
}
void jf(int id,int x,int y,int zax)
{
	if(x<=tr[id].l && tr[id].r<=y)
	{
		tr[id].add=(tr[id].add+zax)%mod;
		tr[id].sum=(tr[id].sum+zax*(tr[id].r-tr[id].l+1))%mod;
		return ;
	}
	wh(id);
	int mid=(tr[id].l+tr[id].r)/2;
	if(x<=mid) jf(id<<1,x,y,zax);
	else jf(id<<1|1,x,y,zax);
	modd(id);
	return ;
}
long long ask(int id,int x,int y)
{
	if(x<=tr[id].l && tr[id].r<=y)
	return tr[id].sum;
	wh(id);
	long long yt=0;
	int mid=(tr[id].l+tr[id].r)/2;
	if(x<=mid) yt=(yt+ask(id<<1,x,y))%mod;
	else yt=(yt+ask(id<<1|1,x,y))%mod;
	return yt;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m>>mod;
	for(i=1;i<=n;i++)
	cin>>a[i];
	build(1,1,n);
	for(i=1;i<=m;i++)
	{
		cin>>op>>x>>y;
		if(op==1)
		{
			cin>>k;
			xf(1,x,y,k);
		}
		if(op==2)
		{
			cin>>k;
			jf(1,x,y,k);
		}
		if(op==3)
		cout<<ask(1,x,y)<<"\n";
	}
	return 0;
}
2023/10/12 18:04
加载中...