线段树2重打30pts求助
查看原帖
线段树2重打30pts求助
347589
Zelotz楼主2022/8/2 12:01
#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define pb push_back
#define reg register
#define mp make_pair
#define R(i, l, r) for (int i = l; i <= r; ++i)
#define debug puts("--------------------------------------------")
typedef __int128 LL;
typedef long long ll;
typedef pair<int, int> PII;
namespace HOOOOOCH {
	template <typename T>
	il void read(T &x) {
		x = 0; T f = 1; char ch;
		while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
		while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
	}
	template <typename T, typename ...L>
	il void read(T &x, L &...y) {read(x); read(y...);}
	template <typename T>
	il void write(T x) {
		if (x < 0) ptc('-'), x = -x;
		if (x > 9) write(x / 10);
		ptc(x % 10 + '0');
	}
	template <typename T, typename ...L>
	il void write(T &x, L &...y) {write(x), ptc(' '); write(y...);}
}
using namespace HOOOOOCH;
#define int ll
const int N = 1e5 + 5;
int n, m, p, a[N], tadd[N << 2], tmul[N << 2], sum[N << 2];
void build(int l, int r, int id) {
	tmul[id] = 1;
	if (l == r) return ;
	int mid = l + r >> 1;
	build(l, mid, id << 1), build(mid + 1, r, id << 1 | 1);
}
void pushdown(int id, int l, int r, int mid) {
	(sum[id << 1] = sum[id << 1] * tmul[id] + tadd[id] * (mid - l + 1)) %= p, (sum[id << 1 | 1] = sum[id << 1 | 1] * tmul[id] + tadd[id] * (r - mid)) %= p;
	sum[id << 1] %= p, sum[id << 1 | 1] %= p;
	(tadd[id << 1] = tadd[id << 1] * tmul[id] + tadd[id]) %= p, (tadd[id << 1 | 1] = tadd[id << 1 | 1] * tmul[id] + tadd[id]) %= p;
	tadd[id << 1] %= p, tadd[id << 1 | 1] %= p;
	(tmul[id << 1] *= tmul[id]) %= p, (tmul[id << 1 | 1] *= tmul[id]) %= p;
	tadd[id] = 0, tmul[id] = 1;
}
void add(int l, int r, int x, int y, int k, int id) {
	if (l > y || r < x) return ;
	if (l >= x && r <= y) return tadd[id] += k, sum[id] += (r - l + 1) * k, sum[id] %= p, void();
	int mid = l + r >> 1;
	pushdown(id, l, r, id);
	add(l, mid, x, y, k, id << 1), add(mid + 1, r, x, y, k, id << 1 | 1);
	sum[id] = sum[id << 1] + sum[id << 1 | 1], sum[id] %= p;
}
void mul(int l, int r, int x, int y, int k, int id) {
	if (l > y || r < x) return ;
	if (l >= x && r <= y) return tadd[id] *= k, tmul[id] *= k, sum[id] *= k, sum[id] %= p, void();
	int mid = l + r >> 1;
	pushdown(id, l, r, mid);
	mul(l, mid, x, y, k, id << 1), mul(mid + 1, r, x, y, k, id << 1 | 1);
	sum[id] = sum[id << 1 | 1] + sum[id << 1], sum[id] %= p;
}
int query(int l, int r, int x, int y, int id) {
	if (l > y || r < x) return 0;
	if (l >= x && r <= y) return sum[id];
	int mid = l + r >> 1;
	pushdown(id, l, r, mid);
	return (query(l, mid, x, y, id << 1) + query(mid + 1, r, x, y, id << 1 | 1)) % p;
}
signed main() {
	read(n, m, p);
	build(1, n, 1);
	R(i, 1, n) read(a[i]), add(1, n, i, i, a[i], 1);
	while (m--) {
		int op, x, y, k;
		read(op, x, y);
		if (op ^ 3) read(k);
		if (op == 1) mul(1, n, x, y, k, 1);
		else if (op == 2) add(1, n, x, y, k, 1);
		else write(query(1, n, x, y, 1) % p), ptc('\n') ;
	}
	return 0;
}
2022/8/2 12:01
加载中...