爆0求助,样例可过,大神求助
查看原帖
爆0求助,样例可过,大神求助
667180
Assassin_HG楼主2023/12/22 20:06

实在是不太懂了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 10;
ll a[maxn], sum[maxn << 2], tag[maxn << 2];
ll ls(ll rt) {
	return rt << 1;
}
ll rs(ll rt) {
	return rt << 1 | 1;
}
void Adda(ll rt, ll l, ll r, ll d) {
	sum[rt] += d * (r - l + 1);
	tag[rt] += d;
}
void Addp(ll rt, ll d) {
	sum[rt] *= d;
	tag[rt] *= d;
}
void Push_up(ll rt) {
	sum[rt] = sum[ls(rt)] + sum[rs(rt)];
}
void Push_down_a(ll rt, ll l, ll r) {
	if (tag[rt]) {
		ll mid = (l + r) >> 1;
		Adda(ls(rt), l, mid, tag[rt]);
		Adda(rs(rt), mid + 1, r, tag[rt]);
		tag[rt] = 0;
	}
}
void Push_down_p(ll rt) {
	if (tag[rt]) {
		Addp(ls(rt), tag[rt]);
		tag[rt] = 0;
	}
}
void Build(ll rt, ll l, ll r) {
	if (l == r) {
		sum[rt] = a[l];
		return;
	}
	ll mid = (l + r) >> 1;
	Build(ls(rt), l, mid);
	Build(rs(rt), mid + 1, r);
	Push_up(rt);
}
void Modify_Add(ll rt, ll l, ll r, ll L, ll R, ll d) {
	if (L <= l && r <= R) {
		Adda(rt, l, r, d);
		return;
	}
	Push_down_a(rt, l, r);
	ll mid = (l + r) >> 1;
	if (L <= mid) {
		Modify_Add(ls(rt), l, mid, L, R, d);
	}
	if (R > mid) {
		Modify_Add(rs(rt), mid + 1, r, L, R, d);
	}
	Push_up(rt);
}
void Modify_Pdd(ll rt, ll l, ll r, ll L, ll R, ll d) {
	if (L <= l && r <= R) {
		Addp(rt, d);
		return;
	}
	Push_down_p(rt);
	ll mid = (l + r) >> 1;
	if (L <= mid) {
		Modify_Pdd(ls(rt), l, mid, L, R, d);
	}
	if (R > mid) {
		Modify_Pdd(rs(rt), mid + 1, r, L, R, d);
	}
	Push_up(rt);
}
ll Ask(ll rt, ll l, ll r, ll L, ll R) {
	if (L <= l && r <= R) {
		return sum[rt];
	}
	Push_down_a(rt, l, r);
	ll mid = (l + r) >> 1;
	ll res = 0;
	if (L <= mid) {
		res += Ask(rt << 1, l, mid, L, R);
	}
	if (R > mid) {
		res += Ask(rt << 1 | 1, mid + 1, r, L, R);
	}
	return res;
}
int main() {
	ll n, q, m;
	scanf("%lld%lld%lld", &n, &q, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	Build(1, 1, n);
	while (q--) {
		ll z, x, y, k;
		scanf("%lld", &z);
		if (z == 1) {
			scanf("%lld%lld%lld", &x, &y, &k);
			Modify_Pdd(1, 1, n, x, y, k);
			Push_down_p(1);
		} else if (z == 2) {
			scanf("%lld%lld%lld", &x, &y, &k);
			Modify_Add(1, 1, n, x, y, k);
			Push_down_a(1, 1, n);
		} else {
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", Ask(1, 1, n, x, y) % m);
		}
	}
	return 0;
}
2023/12/22 20:06
加载中...