社区讨论

线段树2 代码求条

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhk76tf5
此快照首次捕获于
2025/11/04 14:38
4 个月前
此快照最后确认于
2025/11/04 14:38
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long 
using namespace std;
long long s[4010000], tag[4010000], tag2[4010000];
int a[1010000];
int n, q, qll, qrr, op, val, p;
int read()
{
	char c = getchar();
	int res = 0, bj = 1;
	while (c < '0' || c > '9')
	{
		if (c == '-')	bj = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9')	res = res * 10 + c - 48, c = getchar();
	return res * bj;
}
void pushup(int k)
{
	int l = k << 1, r = k << 1 | 1;
	s[k] = (s[l] + s[r]) % p;
}
void upd(int k, int l, int r, int v, int type)
{
	if (type == 1)
		s[k] += (r - l + 1)	* v, s[k] %= p, tag[k] += v;
	if (type == 2)
		s[k] *= v, s[k] %= p, tag2[k] += v;
}
void pushdown(int k, int l, int r, int mid)
{
	int lson = k << 1, rson = k << 1 | 1;
	if (tag[k])
	{
		upd(lson, l, mid, tag[k], 1);
		upd(rson, mid + 1, r, tag[k], 1);
		tag[k] = 0;
	}
	if (tag2[k])
	{
		upd(lson, l, mid, tag2[k], 2);
		upd(rson, mid + 1, r, tag2[k], 2);
		tag2[k] = 0;
	}
}
void update(int k, int l, int r, int ql, int qr, int v, int type)
{
	if (ql <= l && r <= qr)	
	{
		upd(k, l, r, v, type);
		return;
	}
	int mid = (l + r) >> 1;
	pushdown (k, l, r, mid);
	if (ql <= mid)	update(k << 1, l, mid, ql, qr, v, type);
	if (mid < qr) 	update(k << 1 | 1, mid + 1, r, ql, qr, v, type);
	pushup(k);
}
void Build(int k, int l, int r)
{
	if (l == r)	
	{
		s[k] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	Build (k << 1, l, mid);
	Build (k << 1 | 1, mid + 1, r);
	pushup(k); 
}
long long ask(int k, int l, int r, int ql, int qr)
{
	if (ql <= l && r <= qr)	return s[k];
	long long mid = (l + r) >> 1, sum = 0;
	pushdown (k, l, r, mid);
	if (ql <= mid)	sum += ask(k << 1, l, mid, ql, qr) % p;
	if (mid < qr) 	sum += ask(k << 1 | 1, mid + 1, r, ql, qr) % p;
	return sum;
 } 
signed main()
{
	n = read(), q = read(), p = read();
	for (int i = 1; i <= n; i++)	a[i] = read();
	Build (1, 1, n);
	for (int i = 1; i <= q; i++)
	{	
		op = read(), qll = read(), qrr = read();
		if (op == 1)
		{
			val = read();
			update (1, 1, n, qll, qrr, val, 2);
		}
		if (op == 2)
		{
			val = read();
			update (1, 1, n, qll, qrr, val, 1);
		}
		if (op == 3)
			printf("%lld\n", ask(1, 1, n, qll, qrr) % p);
	}
	return 0;
}

回复

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

正在加载回复...