线段树萌新求助(为啥本地都跑不起来啊哪里错了)
查看原帖
线段树萌新求助(为啥本地都跑不起来啊哪里错了)
127299
Young_Zn_Cu楼主2020/7/28 16:09

调了一下午了 真给跪了

#include <bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=100000+50;
int n,Mod,a[N],m;
int opt;
struct node{
	int sum,tag1,tag2;
	#define sum(p) tr[p].sum
	#define tag1(p) tr[p].tag1
	#define tag2(p) tr[p].tag2
	//tag1 -> mul
	//tag2 -> add 
}tr[N<<2];
inline void pushup(int p){sum(p)=(sum(p<<1)+sum(p<<1|1))%Mod;}
inline void add(int p,int l,int r,int v){
	tag2(p)=(tag2(p)+v)%Mod;sum(p)=(sum(p)+v*(r-l+1)%Mod)%Mod;
	return;
}
inline void mul(int p,int l,int r,int v){
	tag1(p)=tag1(p)*v%Mod;sum(p)=(sum(p)*v%Mod)%Mod;tag2(p)=tag2(p)*v%Mod;
	return;
}
inline void pushdown1(int p,int l,int r){
	int mid=(l+r)>>1;
	sum(p<<1)=(sum(p<<1)*tag1(p)%Mod+(mid-l+1)*tag2(p)%Mod)%Mod;
	sum(p<<1|1)=(sum(p<<1|1)*tag1(p)%Mod+(r-mid)*tag2(p)%Mod)%Mod;
	tag1(p<<1)=tag1(p<<1)*tag1(p)%Mod;
	tag1(p<<1|1)=tag1(p<<1|1)*tag1(p)%Mod;
	tag1(p)=1;
}
inline void pushdown2(int p,int l,int r){
	//
	int mid=(l+r)>>1;
	sum(p<<1)=(sum(p<<1)*tag1(p)%Mod+tag2(p))%Mod;
	sum(p<<1|1)=(sum(p<<1|1)*tag1(p)%Mod+tag2(p))%Mod;
	//
	tag2(p<<1)=(tag2(p<<1)*tag1(p)%Mod+tag2(p))%Mod;
	tag2(p<<1|1)=(tag2(p<<1|1)*tag1(p)%Mod+tag2(p))%Mod;
	tag2(p)=0;
}
inline void build(int p,int l,int r){
	tag1(p)=1;tag2(p)=0;
	if(l==r) sum(p)=a[l]%Mod;
	int mid=(l+r)>>1;
	cerr<<p<<' '<<sum(p)<<endl;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	
//	pushup(p);
	sum(p)=(sum(p<<1)+sum(p<<1|1))%Mod;
	return;
//	cerr<<"---------------"<<endl;
}
inline void modify1(int p,int l,int r,int L,int R,int v){
	if(l>=L&&r<=R) {mul(p,l,r,v);}
	pushdown1(p,l,r);
	pushdown2(p,l,r);
	int mid=(l+r)>>1;
	if(L<=mid) modify1(p<<1,l,mid,L,R,v);
	if(R>mid) modify1(p<<1|1,mid+1,r,L,R,v);
	pushup(p);
}
inline void modify2(int p,int l,int r,int L,int R,int v){
	if(l>=L&&r<=R){add(p,l,r,v);}
	pushdown1(p,l,r);
	pushdown2(p,l,r);
	int mid=(l+r)>>1;
	if(L<=mid) modify2(p<<1,l,mid,L,R,v);
	if(R>mid) modify2(p<<1|1,mid+1,r,L,R,v);
	pushup(p);
}
inline ll query(int p,int l,int r,int L,int R){
	if(l>=L&&r<=R) return sum(p);
	int mid=(l+r)>>1;
	pushdown1(p,l,r);
	pushdown2(p,l,r);
	ll res=0;
	if(L<=mid) res+=query(p<<1,l,mid,L,R);
	if(R>mid) res+=query(p<<1|1,mid+1,r,L,R);
	return res;
}
inline int read(){
	int cnt=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}
	return cnt*f;
}
signed main(){
	freopen("1.in","r",stdin);
	n=read(),Mod=read();
	for(int i=1;i<=n;++i) a[i]=read();
	build(1,1,n);
	m=read();int t,g,c;ll ans;
	for(int i=1;i<=m;++i){
		opt=read();
		if(opt==1){t=read(),g=read(),c=read();modify1(1,1,n,t,g,c);}
		if(opt==2){t=read(),g=read(),c=read();modify2(1,1,n,t,g,c);}
		if(opt==3){t=read(),g=read();ans=(query(1,1,n,t,g)+Mod)%Mod;printf("%lld\n",ans);}
	}
	return 0;
}
2020/7/28 16:09
加载中...