30pts
查看原帖
30pts
742255
happyyu楼主2024/9/3 23:23
#include <bits/stdc++.h>
using namespace std;

long long a[100005], b[400005], lazyadd[400005], lazymul[400005], mod;

void build(int l, int r, int pos) {
	lazymul[pos] = 1;

	if (l >= r) {
		b[pos] = a[l] % mod;
		return;
	}

	int mid = (l + r) / 2;
	build(l, mid, pos << 1);
	build(mid + 1, r, pos << 1 | 1);
	b[pos] = (b[pos << 1] + b[pos << 1 | 1]) % mod;
}

void pushdown(int x, int l, int r) {
	int mid = (l + r) / 2;
	b[x << 1] = (b[x << 1] * lazymul[x] + 1ll * (mid - l + 1) * lazyadd[x]) % mod;
	b[x << 1 | 1] = (b[x << 1 | 1] * lazymul[x] + 1ll * (r - mid) * lazyadd[x]) % mod;
	lazyadd[x << 1] += lazyadd[x];
	lazyadd[x << 1 | 1] += lazyadd[x];
	lazymul[x << 1 | 1] *= lazymul[x];
	lazymul[x << 1] *= lazymul[x];
	lazyadd[x << 1] %= mod;
	lazymul[x << 1 | 1] %= mod;
	lazymul[x << 1] %= mod;
	lazyadd[x << 1 | 1] %= mod;
	lazyadd[x] = 0;
	lazymul[x] = 1;
}

void addsum(int l, int r, int ll, int rr, long long k, int pos) {
	if (ll <= l && r <= rr) {
		b[pos] += 1ll * (r - l + 1) * k;
		lazyadd[pos] += k;
		b[pos] %= mod;
		lazyadd[pos] %= mod;
		return;
	}

	pushdown(pos, l, r);
	int mid = (l + r) / 2;

	if (ll <= mid) {
		addsum(l, mid, ll, rr, k, pos << 1);
	}

	if (rr > mid)
		addsum(mid + 1, r, ll, rr, k, pos << 1 | 1);

	b[pos] = b[pos << 1] + b[pos << 1 | 1];
	b[pos] %= mod;
}

void addmul(int l, int r, int ll, int rr, long long k, int pos) {
	if (ll <= l && r <= rr) {
		b[pos] *= k;
		lazymul[pos] *= k;
		lazyadd[pos] *= k;
		lazyadd[pos] %= mod;
		b[pos] %= mod;
		lazymul[pos] %= mod;
		return;
	}

	pushdown(pos, l, r);
	int mid = (l + r) / 2;

	if (ll <= mid)
		addmul(l, mid, ll, rr, k, pos << 1);

	if (rr > mid)
		addmul(mid + 1, r, ll, rr, k, pos << 1 | 1);

	b[pos] = b[pos << 1] + b[pos << 1 | 1];
	b[pos] %= mod;
}

long long query(int l, int r, int ll, int rr, int pos) {
	if (ll <= l && r <= rr) {
		return b[pos];
	}

	pushdown(pos, l, r);
	int mid = (l + r) / 2;
	long long ans = 0;

	if (ll <= mid) {
		ans += query(l, mid, ll, rr, pos << 1);
	}

	if (rr > mid)
		ans += query(mid + 1, r, ll, rr, pos << 1 | 1);

	ans %= mod;
	return ans;
}

int main() {
	int n, q;
	cin >> n >> q >> mod;

	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}

	build(1, n, 1);

	for (int i = 1; i <= q; ++i) {
		int op, x, y;
		scanf("%d%d%d", &op, &x, &y);

		if (x > y)
			swap(x, y);

		if (op == 2) {
			long long k;
			scanf("%lld", &k);
			addsum(1, n, x, y, k, 1);
		} else if (op == 1) {
			long long k;
			scanf("%lld", &k);
			addmul(1, n, x, y, k, 1);
		} else
			printf("%lld\n", query(1, n, x, y, 1));
	}

	return 0;
}
2024/9/3 23:23
加载中...