线段树2 代码求调,悬关。
  • 板块学术版
  • 楼主adsd45666
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/30 15:06
  • 上次更新2024/6/30 18:11:11
查看原帖
线段树2 代码求调,悬关。
1204974
adsd45666楼主2024/6/30 15:06

原题

#include<bits/stdc++.h>
#define ll long long
#define seq(q,w,e) for(int q=w;q<=e;q++)
using namespace std;
const int maxn=1e5+10;
const int maxx=4e5+10;
ll n,q,m; 
ll op,x,y,k;
ll a[maxn],tree[maxx],tag1[maxx],tag2[maxx];
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)])%m;
}
void build_tree(ll p,ll pl,ll pr){
	tag1[p]=0;
	tag2[p]=1;
	if(pl==pr){
		tree[p]=a[pl];
		return;
	}
	else{
		ll mid=(pl+pr)>>1;
		build_tree(ls(p),pl,mid);
		build_tree(rs(p),mid+1,pr);
	}
	tree[p]%=m;
	push_up(p);
}
void add_tag(ll p,ll pl,ll pr,ll d){
	tag1[p]=(tag1[p]+d)%m;
	tree[p]=(tree[p]+d*(pr-pl+1))%m;
}
void add_cheng(ll p,ll x){
	tree[p]=(tree[p]*x)%m;
	tag1[p]=(tag1[p]*x)%m;
	tag2[p]=x%m;
}
void push_down(ll p,ll pl,ll pr){
	ll mid=(pl+pr)>>1;
	if(tag2[p]){
		add_cheng(ls(p),tag2[p]);
		add_cheng(rs(p),tag2[p]);
		tag2[p]=1;
	}
	if(tag1[p]){
		add_tag(ls(p),pl,mid,tag1[p]);
		add_tag(rs(p),mid+1,pr,tag1[p]);
		tag1[p]=0;
	}
}
void cheng(ll l,ll r,ll p,ll pl,ll pr,ll x){
	if(l<=pl&&pr<=r){
		add_cheng(p,x);
		return;
	}
	push_down(p,pl,pr);
	ll mid = (pl+pr)>>1;
	if(l<=mid) cheng(l,r,ls(p),pl,mid,x);
	if(r>mid) cheng(l,r,rs(p),mid+1,pr,x);
	push_up(p);
}
void up_data(ll l,ll r,ll p,ll pl,ll pr,ll d){
	if(l<=pl&&pr<=r){
		add_tag(p,pl,pr,d);
		return;
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)>>1;
	if(l<=mid) up_data(l,r,ls(p),pl,mid,d  );
	if(r>mid)  up_data(l,r,rs(p),mid+1,pr,d);
	push_up(p);
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
	if(pl>=l&&r>=pr) return tree[p];
	push_down(p,pl,pr);
	ll res=0;
	ll mid=(pl+pr)>>1;
	if(l<=mid) res+=query(l,r,ls(p),pl,mid  );
	if(r>mid)  res+=query(l,r,rs(p),mid+1,pr);
	if(res>m) res-=m;
	return res;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>q>>m;
	seq(i,1,n) cin>>a[i];
	build_tree(1,1,n);
	seq(i,1,q){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			cheng(x,y,1,1,n,k);
		}
		if(op==2){
			cin>>k;
			up_data(x,y,1,1,n,k);
		}
		if(op==3){
			cout<<query(x,y,1,1,n)%m<<"\n";
		}
	}
	return 0;
}
2024/6/30 15:06
加载中...