我的动态开点30分 后面还是答案错了和接近TLE WHAT!!
查看原帖
我的动态开点30分 后面还是答案错了和接近TLE WHAT!!
141335
qwq2519楼主2020/8/27 09:33
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=k+1;++i)
using namespace std;
typedef long long ll;
const int N=700007;
ll root,cnt;
ll lc[N],rc[N],sum[N];
ll mul[N],add[N];
ll m,n,mod;

inline void read(ll &x)
{
	x=0;int w=0;
	register char ch=getchar();
	while(ch>'9'||ch<'0'){w|=ch=='-';ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch&15);ch=getchar();}
	w? x=~(x-1):x;
}

inline void spread(int p,int l,int r)
{
	
	if(!lc[p]) lc[p]=++cnt;
	if(!rc[p]) rc[p]=++cnt;
	int mid=(l+r)>>1;
	
	sum[lc[p]]=(sum[lc[p]]*mul[p]%mod+(add[p]*(mid-l+1))%mod )%mod;
	sum[rc[p]]=(sum[rc[p]]*mul[p]%mod+(add[p]*(r-mid))%mod )%mod;
	
	mul[lc[p]]=(mul[lc[p]]*mul[p])%mod;
	mul[rc[p]]=(mul[rc[p]]*mul[p])%mod;
	add[lc[p]]=(add[lc[p]]+add[p])%mod;
	add[rc[p]]=(add[rc[p]]+add[p])%mod;
	
	mul[p]=1;
	add[p]=0;
}




inline void insertadd(ll &p,int L,int R,int ll,int rr,int v)
{
	if(!p) p=++cnt;
	
	if(ll<=L&&rr>=R)
	{
		sum[p]+=(R-L+1)*v%mod;
		add[p]=(add[p]+v)%mod;
		return;
	}
   spread(p,L,R);
	int mid=(L+R)>>1;
	if(ll<=mid) insertadd(lc[p],L,mid,ll,rr,v);
	if(rr>mid) insertadd(rc[p],mid+1,R,ll,rr,v);
	sum[p]=sum[lc[p]]+sum[rc[p]];
}

inline void insertmul(ll &p,int L,int R,int ll,int rr,int v)
{
	if(!p) p=++cnt;
	
	if(ll<=L&&rr>=R)
	{
		sum[p]=(sum[p]*v)%mod;
		mul[p]=(mul[p]*v)%mod;
		add[p]=(add[p]*v)%mod;
		return ;
	}
	spread(p,L,R);
	int mid=(L+R)>>1;
	if(ll<=mid) insertmul(lc[p],L,mid,ll,rr,v);
	if(rr>mid) insertmul(rc[p],mid+1,R,ll,rr,v);
	sum[p]=sum[lc[p]]+sum[rc[p]];
}

inline ll ask(int p,int L,int R,int ll,int rr)
{
	if(!p) return 0;
	if(ll<=L&&rr>=R)
	{
		return sum[p];
	}
	spread(p,L,R);
	long long val=0;
	int mid=(L+R)>>1;
	if(ll<=mid) val=(val+ask(lc[p],L,mid,ll,rr))%mod;
	if(rr>mid) val=(val+ask(rc[p],mid+1,R,ll,rr))%mod;
	return val%mod;
}
ll x,y,z,k;
int main()
{
//	freopen("1,in","r",stdin);
//	freopen("2.out","w",stdout);
 read(n);read(m);read(mod);
 rep(i,1,n) mul[i]=1;
 rep(i,1,n)
 {
  read(x);
  x%=mod;
  insertadd(root,1,n,i,i,x);	
 }
 for(int i=1;i<=m;++i)
 {
 	
 	read(x);
 	if(x==1)
 	{
 		read(y);read(z);read(k);
 		insertmul(root,1,n,y,z,k);
	 }
	if(x==2)
	{
		read(y);read(z);read(k);
		insertadd(root,1,n,y,z,k);
	}
	if(x==3) {
		read(y);read(z);
		cout<<ask(root,1,n,y,z)%mod<<endl;
	}
 }
}
2020/8/27 09:33
加载中...