不能过样例,求助
查看原帖
不能过样例,求助
181437
cyfff楼主2020/11/16 20:37
#include<bits/stdc++.h>
#define LL long long
#define ri register long long
#define ls now*2
#define rs now*2+1
using namespace std;
inline LL rd(){
	ri res=0,f=1;register char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())res=(res<<1)+(res<<3)+ch-'0';
	return res*f;
}
LL a[100005],mu[400005],ad[400005],vl[400005],n,m,p,op,x,y,z;
void bd(LL now,LL l,LL r){
	mu[now]=1;
	if(l==r)vl[now]=a[l];
	else{
		ri md=(l+r)>>1;bd(ls,l,md);bd(rs,md+1,r);
		vl[now]=vl[ls]+vl[rs];
	}
	vl[now]%=p;
}
void pd(LL now,LL l,LL r){
	ri md=(l+r)>>1;
	vl[ls]=(vl[ls]*mu[now]+(md-l+1)*ad[now])%p;
	vl[rs]=(vl[rs]*mu[now]+(r-md)*ad[now])%p;
	(mu[ls]*=mu[now])%=p;(mu[rs]*=mu[now])%=p;
	ad[ls]=(ad[ls]*mu[now]+ad[now])%p;
	ad[rs]=(ad[rs]*mu[now]+ad[now])%p;
	mu[now]=1;ad[now]=0;
}
void upd(LL now,LL l,LL r){
	if(y<l||x>r)return;
	if(x<=l&&r<=y){
		(vl[now]*=z)%=p;(ad[now]*=z)%=p;
		(mu[now]*=z)%=p;return;
	}
	pd(now,l,r);ri md=(l+r)>>1;
	upd(ls,l,md);upd(rs,md+1,r);
	vl[now]=(vl[ls]+vl[rs])%p;
}
void up(LL now,LL l,LL r){
	if(y<l||x>r)return;
	if(x<=l&&r<=y){
		(vl[now]+=z*(r-l+1))%=p;
		(ad[now]+=z)%=p;return;
	}
	pd(now,l,r);ri md=(l+r)>>1;
	up(ls,l,md);up(rs,md+1,r);
	vl[now]=(vl[ls]+vl[rs])%p;
}
LL qr(LL now,LL l,LL r){
	if(y<l||x>r)return 0;
	if(x<=l&&r<=y)return vl[now];
	ri md=(l+r)>>1;
	return (qr(ls,l,md)+qr(rs,md+1,r))%p;
}
int main(){
	n=rd();m=rd();p=rd();
	for(x=1;x<=n;++x)a[x]=rd();
	for(bd(1,1,n);m--;){
		op=rd();x=rd();y=rd();
		if(op==1){z=rd();upd(1,1,n);}
		else if(op==2){z=rd();up(1,1,n);}
		else printf("%lld\n",qr(1,1,n));
	}
	return 0;
} 
2020/11/16 20:37
加载中...