蒟蒻求助
查看原帖
蒟蒻求助
747206
5201314lhl楼主2024/11/3 21:14
#include <bits/stdc++.h>
#include <cstdio>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
ll d[4 * N], bc[4 * N], bj[4 * N];
int n, q, mod;
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9') {
		if(ch == '-')f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}
inline void pd(ll p, ll s, ll t) {
	ll l = p * 2;
	ll r = p * 2 + 1;
	ll  m = (l + r) >> 1;
	if(bc[p] != 1) {
		bc[l] *= bc[p];
		bc[l] %= mod;
		bc[r] *= bc[p];
		bc[r] %= mod;
		d[l] *= bc[p];
		d[l] %= mod;
		d[r] *= bc[p];
		d[r] %= mod;
		bj[l] *= bc[p];
		bj[l] %= mod;
		bj[r] *= bc[p];
		bj[r] %= mod;
		bc[p] = 1;
	}
	if(bj[p]) {
		d[l] += bj[p] * (m - s + 1);
		d[l] %= mod;
		d[r] += bj[p] * (t - m);
		d[r] %= mod;
		bj[l] += bj[p];
		bj[l] %= mod;
		bj[r] += bj[p];
		bj[r] %= mod;
		bj[p] = 0;
	}
	return ;
}
inline void build(ll l, ll r, ll p) {
	bc[p] = 1;
	if(l == r) {
		d[p] = read();
		return ;
	}
	int m = (l + r) >> 1;
	build(l , m, p * 2);
	build(m + 1, r, p * 2 + 1);
	d[p] = (d[p * 2] + d[p * 2 + 1]) % mod;
}
inline void cheng(ll l, ll r, ll cs, ll s, ll t, ll p) {
	if(l <= s && t <= r) {
		bc[p] *= cs;
		bc[p] %= mod;
		d[p] *= cs;
		d[p] %= mod;
		return ;
	}
	ll m = (s + t) >> 1;
	pd(p, s, t);
	if(l <= m)cheng(l, r, cs, s, m, p * 2);
	if(r > m)cheng(l, r, cs, m + 1, t, p * 2 * 1);
	d[p] = (d[p * 2] + d[p * 2 + 1]) % mod;
}
inline void jia(ll l, ll r, ll cs, ll s, ll t, ll p) {
	if(l <= s && t <= r) {
		d[p] += cs * (t - s + 1);
		d[p] %= mod;
		bj[p] += cs;
		bj[p] %= mod;
		return ;
	}
	ll m = (s + t) >> 1;
	pd(p, s, t);
	if (l <= m) jia(l, r, cs, s, m, p * 2);
	if (r > m) jia(l, r, cs, m + 1, t, p * 2 + 1);
}
inline ll getsum(ll l, ll r, ll s, ll t, ll p) {
	if(l <= s && t <= r) {
		return d[p];
	}
	ll m = s + (t - s) / 2;
	pd(p, s, t);
	ll sum = 0;
	if(l <= m) sum += getsum(l, r, s, m, p * 2);
	if(r > m) sum += getsum(l , r, m + 1, t, p * 2 + 1);
	return sum % mod;
}
int main() {
	int x1, x2, x3, x4;
	n = read();
	q = read();
	mod = read();
	build(1, n, 1);
	for(int i = 1; i <= q; i ++ ) {
		x1 = read(), x2 = read(), x3 = read();
		if(x1 == 1) {
			x4 = read();
			cheng(x2, x3, x4, 1, n, 1);
		} else if(x1 == 2) {
			x4 = read();
			jia(x2, x3, x4, 1, n, 1);
		} else if(x1 == 3) {
			printf("%lld\n", getsum(x2, x3, 1, n, 1));
		}
	}
	return 0;
}

2024/11/3 21:14
加载中...