30分求调,悬关
查看原帖
30分求调,悬关
609448
l0_0zy楼主2024/7/12 08:56
#include <bits/stdc++.h>
#define ll long long
#define ls (now*2)
#define rs ((now*2)+1)
#define mid ((l+r)/2)
using namespace std;
const ll modd=571373,maxn=400010;

ll sum[maxn],lazy1[maxn],lazy2[maxn];

void add(ll &x,ll y) { x=((x%modd)+(y%modd))%modd; return; }
void mul(ll &x,ll y) { x=((x%modd)*(y%modd))%modd; return; }

void up(ll now)  { sum[now]=(sum[ls]+sum[rs])%modd; return; }

void work(ll now,ll l,ll r,ll j,ll c)
{
	mul(sum[now],c);add(sum[now],(j*(r-l+1))%modd);
	mul(lazy1[now],c);mul(lazy2[now],c);
	add(lazy1[now],j);
}

void pd(ll now,ll l,ll r)
{
	work(ls,l,mid,lazy1[now],lazy2[now]);
	work(rs,mid+1,r,lazy1[now],lazy2[now]);
	lazy1[now]=0;lazy2[now]=1;
}

void cheng(ll now,ll l,ll r,ll L,ll R,ll val)
{
	if(L<=l&&r<=R)  { mul(sum[now],val); mul(lazy1[now],val); mul(lazy2[now],val); return; }
	pd(now,l,r);
	if(L<=mid)  cheng(ls,l,mid,L,R,val);  if(R>mid)  cheng(rs,mid+1,r,L,R,val);
	up(now);
	return;
}

void jia(ll now,ll l,ll r,ll L,ll R,ll val)
{
	if(L<=l&&r<=R)  { add(sum[now],(val*(r-l+1))%modd); add(lazy1[now],val); return; }
	pd(now,l,r);
	if(L<=mid)  jia(ls,l,mid,L,R,val);  if(R>mid)  jia(rs,mid+1,r,L,R,val);
	up(now);
	return;
}

ll cha(ll now,ll l,ll r,ll L,ll R)
{
	lazy2[now]=max(lazy2[now],1LL);
	if(L<=l&&r<=R)  return sum[now];
	pd(now,l,r);
	ll ret=0;
	if(L<=mid)  add(ret,cha(ls,l,mid,L,R));  if(R>mid)  add(ret,cha(rs,mid+1,r,L,R));
	return ret;
}

ll n,q,m;

int main()
{
	cin>>n>>q>>m;
	for(int i=0;i<maxn;i++)  lazy2[i]=1;
	for(ll i=1;i<=n;i++)
	{
		ll a;cin>>a;
		jia(1,1,n,i,i,a);
	}
	while(q--)
	{
		ll e,x,y;
		cin>>e>>x>>y;
		if(e==1)
		{
			ll k;cin>>k;
			cheng(1,1,n,x,y,k%modd);
		}
		else if(e==2)
		{
			ll k;cin>>k;
			jia(1,1,n,x,y,k%modd);
		}
		else  cout<<cha(1,1,n,x,y)<<"\n";
		//for(ll i=1;i<=n;i++)  cout<<cha(1,1,n,i,i)<<" ";
		//cout<<"\n";
	}
	return 0;
} 

记录详情

2024/7/12 08:56
加载中...