社区讨论

0pts求条

P3373【模板】线段树 2参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mibmagqq
此快照首次捕获于
2025/11/23 19:10
4 个月前
此快照最后确认于
2025/11/23 20:16
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define ll long long
#define LC 2*cur
#define RC 2*cur+1
ll a[N];
int mod;
struct Node{
	int l,r;
	ll value,tag,mul;
	int len(){
		return r-l+1;
	}
}tree[N*4];
void pushup(int cur){
	tree[cur].value=tree[LC].value+tree[RC].value;
}
void build(int cur,int l,int r){
	tree[cur].l=l,tree[cur].r=r;
	if(l==r){
		tree[cur].value=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(LC,l,mid);
	build(RC,mid+1,r);
	pushup(cur);
}
void work(int cur,ll delta,int op){
	if(op==2){
		tree[cur].value+=(tree[cur].len()*delta);
		tree[cur].tag+=delta;
	}
	else{
		tree[cur].value=tree[cur].value*delta%mod;
		tree[cur].mul*=delta,tree[cur].tag*=delta;
	}
}
void pushdown(int cur){
	if(tree[cur].mul>0){
		work(LC,tree[cur].mul,1),work(RC,tree[cur].mul,1);
		tree[cur].mul=0;
	}
	if(tree[cur].tag>0){
		work(LC,tree[cur].tag,2),work(RC,tree[cur].tag,2);
		tree[cur].tag=0;
	}
}
void update(int cur,int l,int r,ll delta,int op){
	if(l<=tree[cur].l&&r>=tree[cur].r){
		work(cur,delta,op);
		return;
	}
	pushdown(cur);
	int mid=(tree[cur].r+tree[cur].l)/2;
	if(mid>=l)update(LC,l,r,delta,op);
	if(mid<r)update(RC,l,r,delta,op);
	pushup(cur);
}
ll query(int cur,int l,int r){
	if(l<=tree[cur].l&&r>=tree[cur].r)return tree[cur].value;
	pushdown(cur);
	ll ans=0;
	int mid=(tree[cur].r+tree[cur].l)/2;
	if(mid>=l)ans=(ans+query(LC,l,r))%mod;
	if(mid<r)ans=(ans+query(RC,l,r))%mod;
	return ans;
}
int n,m;
int main(){
	cin >> n >> m >> mod;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,x,y;
		ll k;
		cin >> op >> x >> y;
		if(op<=2){
			cin >> k;
			update(1,x,y,k,op);
		}
		else {
			cout << query(1,x,y) << '\n';
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...