大佬看看,样例过了,全wa
查看原帖
大佬看看,样例过了,全wa
244597
kabout楼主2020/8/11 19:48
#include<bits/stdc++.h>
using namespace std;
int n,m,st[400001],a[100001],lazy[400001],lazy2[400001],p,op,x,y,z;
void pushdown(int rt,int l,int r) 
{
	if((lazy[rt]||lazy2[rt]>1))
	{
		int mid=(l+r)/2;
		st[rt*2]=(st[rt*2]*lazy2[rt]+lazy[rt]*(mid-l+1))%p;
		st[rt*2+1]=(st[rt*2+1]*lazy2[rt]+lazy[rt]*(r-mid))%p;
		lazy2[rt*2]=(lazy2[rt*2]*lazy2[rt])%p;
		lazy2[rt*2+1]=(lazy2[rt*2+1]*lazy2[rt])%p;
		lazy[rt*2]=(lazy2[rt]*lazy[rt*2]+lazy[rt])%p;
		lazy[2*rt+1]=(lazy2[rt]*lazy[rt*2+1]+lazy[rt])%p;
		lazy[rt]=0;
		lazy2[rt]=1;
	}
}
int creat(int rt,int l,int r)
{
	if(l==r)return st[rt]=a[l];
	int mid=(l+r)/2;
	st[rt]=creat(2*rt,l,mid)+creat(2*rt+1,mid+1,r);
	return st[rt];
}
int Find(int rt,int l,int r,int s,int e)
{
	int ans=0,mid=(l+r)/2;
	pushdown(rt,l,r);
	if(s<=l&&r<=e)return st[rt];
	if(s<=mid)ans+=Find(2*rt,l,mid,s,e);
	if(e>mid)ans+=Find(2*rt+1,mid+1,r,s,e);
	return ans;
}
void qujian(int rt,int l,int r,int s,int e,int x)
{
	if(s<=l&&r<=e){
		st[rt]+=(r-l+1)*x;
		lazy[rt]+=x; 
		return;
	}
	pushdown(rt,l,r);
	int mid=(l+r)/2;
	if(s<=mid)qujian(rt*2,l,mid,s,e,x);
	if(e>mid)qujian(rt*2+1,mid+1,r,s,e,x); 
	st[rt]=st[2*rt]+st[rt*2+1];
} 
void qujian2(int rt,int l,int r,int s,int e,int x)
{
	int mid=(l+r)>>1;
	if(s<=l&&r<=e){
		st[rt]*=x;
		lazy2[rt]*=x;
		lazy[rt]*=x;
		return;
	}
	pushdown(rt,l,r);
	if(s<=mid)qujian2(rt*2,l,mid,s,e,x);
	if(e>mid)qujian2(rt*2+1,mid+1,r,s,e,x);
	st[rt]=st[2*rt]+st[rt*2+1];
}
int main(){
	cin>>n>>p;
	for(int i=1;i<=n;i++)lazy2[i]=1;
	for(int i=1;i<=n;i++)cin>>a[i];
	creat(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>z;
			if(z==1)continue;
			qujian2(1,1,n,x,y,z);
		}
		if(op==2)
		{
			cin>>x>>y>>z;
			qujian(1,1,n,x,y,z);
		}
		if(op==3)
		{
			cin>>x>>y;
			cout<<Find(1,1,n,x,y)%p<<endl;
		}
	}
	return 0;
}
2020/8/11 19:48
加载中...