30分求助
查看原帖
30分求助
507170
zhn2016楼主2022/10/23 21:34
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void lan_put(ll no);
void lan_pum(ll no);
const int N = 2e5 + 10;
ll a[N] = {}, q;
struct tree {
	ll l, r, n, lan_put, lan_pum;
} e[4 * N];
void buld(ll l, ll r, ll no) {
	e[no].l = l;
	e[no].r = r;
	e[no].lan_put = 0;
	e[no].lan_pum = 1;
	if (l == r) {
		e[no].n = a[l];
		return;
	}
	ll mid = (l + r) >> 1;
	buld(l, mid, no << 1);
	buld(mid + 1, r, no << 1 | 1);
	e[no].n = e[no << 1].n + e[no << 1 | 1].n;
	return;
}
void lan_put(ll no) {
	if (e[no].l == e[no].r)
		return;
	if (e[no].lan_put == 0)
		return;
	if (e[no << 1].lan_pum != 1)
		lan_pum(no << 1);
	if (e[no << 1 | 1].lan_pum != 1)
		lan_pum(no << 1 | 1);
	e[no << 1].n += (e[no << 1].r - e[no << 1].l + 1) * e[no].lan_put;
	e[no << 1 | 1].n += (e[no << 1 | 1].r - e[no << 1 | 1].l + 1) * e[no].lan_put;
	e[no<<1].lan_put+=e[no].lan_put;
	e[no<<1|1].lan_put+=e[no].lan_put;
	e[no].lan_put = 0;
	return;
}
void lan_pum(ll no) {
	if (e[no].l == e[no].r)
		return;
	if (e[no].lan_pum == 1)
		return;
	if (e[no << 1].lan_put != 0)
		lan_put(no << 1);
	if (e[no << 1 | 1].lan_put != 0)
		lan_put(no << 1 | 1);
	e[no << 1].n *= e[no].lan_pum;
	e[no << 1 | 1].n *= e[no].lan_pum;
	e[no << 1].lan_pum *= e[no].lan_pum;
	e[no << 1 | 1].lan_pum *= e[no].lan_pum;
	e[no].lan_pum = 1;
	return;
}
void put(ll l, ll r, ll no, ll s) {
	if (e[no].l >= l and e[no].r <= r) {
		lan_pum(no);
		e[no].n += (e[no].r - e[no].l + 1) * s;
		e[no].lan_put += s;
		return;
	}
	lan_put(no);
	lan_pum(no);
	ll mid = (e[no].l + e[no].r) >> 1;
	if (l <= mid)put(l, r, no << 1, s);
	if (r > mid)put(l, r, no << 1 | 1, s);
	e[no].n = e[no << 1].n + e[no << 1 | 1].n;
	return;
}
void pum(ll l, ll r, ll no, ll s) {
	if (e[no].l >= l and e[no].r <= r) {
		lan_put(no);
		e[no].n *= s;
		e[no].lan_pum *= s;
		return;
	}
	lan_pum(no);
	lan_put(no);
	int mid = (e[no].l + e[no].r) >> 1;
	if (l <= mid)pum(l, r, no << 1, s);
	if (mid < r)pum(l, r, no << 1 | 1, s);
	e[no].n = e[no << 1].n + e[no << 1 | 1].n;
	return;
}
ll sum(ll l, ll r, ll no) {
	if (e[no].l >= l and e[no].r <= r) {
		return e[no].n;
	}
	if (e[no].lan_pum != 1)
        lan_pum(no);
	if (e[no].lan_put != 0)
        lan_put(no);
	ll x = 0, mid = (e[no].l + e[no].r) >> 1;
	if (l <= mid)
        x += sum(l, r, no << 1);
	if (mid < r)
        x += sum(l, r, no << 1 | 1);
	return x;
}
int main() {
	ll n, m;
	scanf("%lld%lld%lld", &n, &m, &q);
	for (ll i = 1; i <= n; i++)
		scanf("%lld", &a[i]);
	buld(1,n,1);
	for (ll i = 1; i <= m; i++) {
		ll x, a, b, c;
		scanf("%lld", &x);
		if (x == 1) {
			scanf("%lld%lld%lld", &a, &b, &c);
			pum(a, b, 1, c);
		} else if (x == 2) {
			scanf("%lld%lld%lld", &a, &b, &c);
			put(a, b, 1, c);
		} else {
			scanf("%lld%lld", &a, &b);
			printf("%lld\n", sum(a, b, 1)%q);
		}
	}
	return 0;
}
2022/10/23 21:34
加载中...