全WA求调玄关
查看原帖
全WA求调玄关
991533
VecantDK楼主2025/2/7 18:40

样例能过

#include <iostream>
#define ll long long
const int N = 1e5 + 5;
int n, m, p, a[N];
struct Node {
	ll sum, add, mul;
} tr[N << 2];
void pushdown(int o, int l, int r) {
	int mid = l + r >> 1;
	tr[o << 1].sum = (tr[o << 1].sum * tr[o].mul + tr[o].add * (mid - l + 1)) % p;
	tr[o << 1 | 1].sum = (tr[o << 1 | 1].sum * tr[o].mul + tr[o].add * (r - mid)) % p;
	tr[o << 1].mul = (tr[o << 1].mul * tr[o].mul) % p;
	tr[o << 1 | 1].mul = (tr[o << 1 | 1].mul * tr[o].mul) % p; 
	tr[o << 1].add = (tr[o << 1].add * tr[o].mul + tr[o].add) % p;
	tr[o << 1 | 1].add = (tr[o << 1 | 1].add * tr[o].mul + tr[o].add) % p;
	tr[o].add = 0, tr[o].mul = 1;
}
void pushup(int o) {
	tr[o].sum = tr[o << 1].sum + tr[o << 1 | 1].sum;
}
void build(int o, int l, int r) {
	tr[o].mul = 1;
	if (l == r) {
		tr[o].sum = a[l] % p;
		return;
	}
	int mid = l + r >> 1;
	build(o << 1, l, mid);
	build(o << 1 | 1, mid + 1, r);
	pushup(o);
}

void add(int o, int l, int r, int x, int y, int k) {
	if (x <= l && r <= y) {
		tr[o].sum = (tr[o].sum + (r - l + 1) * k) % p;
		tr[o].add = (tr[o].add + k) % p;
		return;
	}
	int mid = l + r >> 1;
	if (tr[o].add && l != r) pushdown(o, l, r);
	if (x <= mid) add(o << 1, l, mid, x, y, k);
	if (y > mid)  add(o << 1 | 1, mid + 1, r, x, y, k);
	pushup(o);
}
void mul(int o, int l, int r, int x, int y, int k) {
	if (x <= l && r <= y) {
		tr[o].sum = (tr[o].sum * k) % p;
		tr[o].mul = (tr[o].mul * k) % p;
		tr[o].add = (tr[o].add * k) % p;
		return;
	}
	int mid = l + r >> 1;
	if (tr[o].mul != 1 && l != r) pushdown(o, l, r);
	if (x <= mid) mul(o << 1, l, mid, x, y, k);
	if (y > mid)  mul(o << 1 | 1, mid + 1, r, x, y, k);
	pushup(o);
}
ll query(int o, int l, int r, int x, int y) {
	if (x <= l && r <= y) return tr[o].sum;
	int mid = l + r >> 1;
	if (tr[o].add || tr[o].mul != 1) pushdown(o, l, r);
	ll sum = 0;
	if (x <= mid) sum = (sum + query(o << 1, l, mid, x, y)) % p;
	if (y > mid)  sum = (sum + query(o << 1 | 1, mid + 1, r, x, y)) % p;
	return sum;
}
int main() {
	scanf("%d%d%d", &n, &m, &p);
	for (int i = 1; i <= n; i++)
		scanf("%d", a + i);
	build(1, 1, n);
	while (m--) {
		int op, x, y;
		ll k;
		scanf("%d%d%d", &op, &x, &y);
		if (op == 1) {
			scanf("%lld", &k);
			k %= p;
			mul(1, 1, n, x, y, k);
		} else if (op == 2) {
			scanf("%lld", &k);
			k %= p;
			add(1, 1, n, x, y, k);
		} else if (op == 3) {
			printf("%lld\n", query(1, 1, n, x, y));
		}
	}
	return 0;
}
2025/2/7 18:40
加载中...