为什么死循环?
查看原帖
为什么死循环?
1232851
Neokaye楼主2024/11/28 21:28
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+5;
const ll mod=38;
ll tree[N<<2],add[N<<2],mul[N<<2];
ll a[N];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void push_up(ll p){tree[p]=(tree[ls(p)]+tree[rs(p)])%mod;}
void build(ll p,ll pl,ll pr){
	add[p]=0;mul[p]=1;
	if(pl==pr){tree[p]=a[pl]%mod;return ;}
	ll mid=pl+pr>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void add_tag(ll p,ll pl,ll pr,ll d){
	tree[p]+=(pr-pl+1)*d;
	add[p]+=d;
}
void mul_tag(ll p,ll pl,ll pr,ll d){
	tree[p]=tree[p]%mod*d%mod;
	add_tag(p,pl,pr,add[p]*(d-1));
}
void push_down(ll p,ll pl,ll pr){
	if(mul[p]>1){
		ll mid=pl+pr>>1;
		mul_tag(ls(p),pl,mid,mul[p]);
		mul_tag(rs(p),mid+1,pr,mul[p]);
		mul[p]=1;
	}
	if(add[p]){
		ll mid=pl+pr>>1;
		add_tag(ls(p),pl,mid,add[p]);
		add_tag(rs(p),mid+1,pr,add[p]);
		add[p]=0;
	}
}
void update1(ll p,ll pl,ll pr,ll L,ll R,ll d){
	if(L<=pl&&pr<=R){mul_tag(p,pl,pr,d);return ;}
	push_down(p,pl,pr);
	ll mid=pl+pr>>1;
	if(mid<R)  update1(ls(p),pl,mid,L,R,d);
	if(L<=mid) update1(rs(p),mid+1,pr,L,R,d);
	push_up(p);
}
void update2(ll p,ll pl,ll pr,ll L,ll R,ll d){
	if(L<=pl&&pr<=R){add_tag(p,pl,pr,d);return ;}
	push_down(p,pl,pr);
	ll mid=pl+pr>>1;
	cout<<mid<<endl;
	if(mid<R)  update2(ls(p),pl,mid,L,R,d);
	if(L<=mid) update2(rs(p),mid+1,pr,L,R,d);
	push_up(p);
}
ll query(ll p,ll pl,ll pr,ll L,ll R){
	if(L<=pl&&pr<=R){return tree[p]%mod;}
	push_down(p,pl,pr);
	ll mid=pl+pr>>1;
	ll res=0;
	if(mid<R)  res=(res+query(ls(p),pl,mid,L,R))%mod;
	if(mid>=L) res=(res+query(rs(p),mid+1,pr,L,R))%mod;
	return res;
}
int main(){
	//ios::sync_with_stdio(false);
	//cin.tie(0);
	ll n,q,x;cin>>n>>q>>x;
	for(ll i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(q--){
		 ll opt,l,r,d;cin>>opt>>l>>r;
		 if(opt==1){cin>>d;update1(1,1,n,l,r,d);}
		 if(opt==2){cin>>d;update2(1,1,n,l,r,d);}
		 if(opt==3){cout<<query(1,1,n,l,r)<<'\n';}
	}
	return 0;
}
2024/11/28 21:28
加载中...