社区讨论

0分求调,违规紫衫

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhjuyzg7
此快照首次捕获于
2025/11/04 08:56
4 个月前
此快照最后确认于
2025/11/04 08:56
4 个月前
查看原帖
CPP
#include <iostream>
#define int long long

using namespace std;

const int N = 1e7 + 5;

struct qq{
	int l,r;
	long long ad,va,sum;
}tr[N];

int n,m,q,a[N];

void push_up (int u) {
	tr[u].sum = (tr[u << 1].sum + tr[u << 1 | 1].sum) % m;
	return ;
}

void push_down (int u) {
	
	tr[u << 1].sum = (tr[u << 1].sum * tr[u].va + tr[u].ad * (tr[u << 1].r - tr[u << 1].l + 1)) % m;
	tr[u << 1 | 1].sum = (tr[u << 1 | 1].sum * tr[u].va + tr[u].ad * (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1)) % m;
	
	tr[u << 1].va = (tr[u].va * tr[u << 1].va) % m;
	tr[u << 1 | 1].va = (tr[u].va * tr[u << 1 | 1].va) % m;
	
	tr[u << 1].ad = (tr[u].va * tr[u << 1].ad + tr[u].ad) % m;
	tr[u << 1 | 1].ad = (tr[u].va * tr[u << 1 | 1].ad + tr[u].ad) % m;
	
	tr[u].ad = 0;
	tr[u].va = 1;
}

void build (int u,int l,int r) {
	
	tr[u].l = l;
	tr[u].r = r;
	tr[u].va = 1;
	
	if (l == r) {
		tr[u].sum = a[l] % m;
		return ;
	}
	
	int mid = (l + r) >> 1;
	
	build (u << 1,l,mid);
	build (u << 1 | 1,mid + 1,r);
	
	push_up (u);
}

void add (int u,int l,int r,int k) {
	
	if (l <= tr[u].l && tr[u].r <= r) {
		tr[u].ad = (tr[u].ad + k) % m;
		tr[u].sum = (tr[u].sum + k * (tr[u].r - tr[u].l + 1)) % m;
		return ;
	}
	
	push_down (u);
	
	int mid = (tr[u].l + tr[u].r) >> 1;
	
	if (l <= mid) add (u << 1,l,r,k);
	if (r > mid) add (u << 1 | 1,l,r,k);
	
	push_up (u);
}

void val (int u,int l,int r,int k) {
	
	if (l <= tr[u].l && tr[u].r <= r) {
		tr[u].ad = (tr[u].ad * k) % m;
		tr[u].va = (tr[u].va * k) % m;
		tr[u].sum = (tr[u].sum * k) % m;
		return ;
	}
	
	push_down (u);
	int mid = (tr[u].l + tr[u].r) >> 1;
	
	if (l <= mid) val (u << 1,l,r,k);
	if (r > mid) val (u << 1 | 1,l,r,k);
	
	push_up (u);
}

int query (int u,int l,int r) {
	
	if (l <= tr[u].l && tr[u].r <= r) return tr[u].sum;
	
	int ans = 0;
	int mid = (tr[u].l + tr[u].r) >> 1;
	push_down (u);
	
	if (l <= mid) ans = (ans + query (u << 1,l,r)) % m;
	if (r > mid) ans = (ans + query (u << 1 | 1,l,r)) % m;
	
	return ans;
}

signed main() {
	
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n >> q >> m;
	
	for (int i = 1;i <= n;i ++) cin >> a[i];
	
	build (1,1,n);
	
	while (q --) {
		
		int op;
		cin >> op;
		
		if (op == 1) {
			int x,y,k;
			cin >> x >> y >> k;
			val (1,x,y,k);
		} else if (op == 2) {
			int x,y,k;
			cin >> x >> y >> k;
			add (1,x,y,k);
		} else {
			int x,y;
			cout << query (1,x,y) << '\n';
		}
		
	}
	return 0;
}

回复

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

正在加载回复...