mxqz 分块
查看原帖
mxqz 分块
324666
diqiuyi奶龙楼主2023/4/27 14:02

rt,WA 30pts

#include <bits/stdc++.h>
using namespace std;
int n,m,p,opt,l,r,x,a[114514],bl[114514],sum[114514],block,tag1[114514],tag2[114514];
inline void psd(int x){
	for(int i=(x-1)*block+1;i<=min(n,x*block);i++)
		a[i]=1ll*a[i]*tag1[x]%p,a[i]=(a[i]+tag2[x])%p;
	tag1[x]=1,tag2[x]=0;
}
signed main(){ 
//	freopen("P3373_2.in","r",stdin);
//	freopen("P3373.txt","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>p,block=pow(n,0.46);
    for(int i=1;i<=n;i++) cin>>a[i],bl[i]=(i-1)/block+1,sum[bl[i]]=(sum[bl[i]]+a[i])%p;
	for(int i=1;i<=bl[n];i++) tag1[i]=1;
    while(m--){
    	cin>>opt>>l>>r;
    	if(opt==1){
    		cin>>x;
    		if(tag1[bl[l]]>1||tag2[bl[l]]) psd(bl[l]);
    		for(int i=l;i<=min(r,bl[l]*block);i++)
				a[i]=1ll*a[i]*x%p,sum[bl[i]]=1ll*sum[bl[i]]*x%p;
			if(bl[l]^bl[r]){
				if(tag1[bl[r]]>1||tag2[bl[r]])psd(bl[r]);
				for(int i=(bl[r]-1)*block+1;i<=r;i++)
					a[i]=1ll*a[i]*x%p,sum[bl[i]]=1ll*sum[bl[i]]*x%p;
			}	 
			for(int i=bl[l]+1;i<bl[r];i++)
				tag1[i]=1ll*tag1[i]*x%p,tag2[i]=1ll*tag2[i]*x%p,sum[i]=1ll*sum[i]*x%p;
		}
		else if(opt==2){
			cin>>x;
    		if(tag1[bl[l]]>1||tag2[bl[l]]) psd(bl[l]);
    		for(int i=l;i<=min(r,bl[l]*block);i++)
				a[i]=(a[i]+x)%p,sum[bl[i]]=(sum[bl[i]]+x)%p;
			if(bl[l]^bl[r]){
				if(tag1[bl[r]]>1||tag2[bl[r]]) psd(bl[r]);
				for(int i=(bl[r]-1)*block+1;i<=r;i++)
					a[i]=(a[i]+x)%p,sum[bl[i]]=(sum[bl[i]]+x)%p;
			}	 
			for(int i=bl[l]+1;i<bl[r];i++)
				tag2[i]=(tag2[i]+x)%p,sum[i]=(1ll*sum[i]+1ll*x*block)%p;
		}
		else{
			int ans=0;
    		for(int i=l;i<=min(r,bl[l]*block);i++)
				ans=(1ll*ans+1ll*a[i]*tag1[bl[i]]%p+tag2[bl[i]])%p;
			if(bl[l]^bl[r])
				for(int i=(bl[r]-1)*block+1;i<=r;i++)
					ans=(1ll*ans+1ll*a[i]*tag1[bl[i]]%p+tag2[bl[i]])%p;
			for(int i=bl[l]+1;i<bl[r];i++)
				(ans+=sum[i])%=p;
			cout<<ans<<'\n';
		}
	}
    return 0;
}
2023/4/27 14:02
加载中...