线段树求调qwq
查看原帖
线段树求调qwq
526017
COsm0s楼主2023/1/9 09:17

没过样例。。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int mod, sum[N << 2], a[N], add[N << 2], mul[N << 2];
inline void PushUp(int x) {
	sum[x] = (sum[x << 1] + sum[x << 1 | 1]) % mod;
}
inline void Build(int l, int r, int x) {
	if(l == r) {
		sum[x] = a[l];
		return ;
	}
	int mid = l + r >> 1;
	Build(l, mid, x << 1);
	Build(mid + 1, r, x << 1 | 1);
	PushUp(x);
}
inline void PushDown(int x, int ln, int rn) {
		mul[x << 1] *= mul[x];
		mul[x << 1 | 1] *= mul[x];
		add[x << 1] = add[x << 1] * mul[x] + add[x];
		add[x << 1 | 1] = add[x << 1 | 1] * mul[x] + add[x];
		sum[x << 1] = sum[x << 1] * mul[x] + ln * add[x];
		sum[x << 1 | 1] = sum[x << 1 | 1] * mul[x] + rn * add[x];
		mul[x << 1] %= mod;
		mul[x << 1 | 1] %= mod;
		add[x << 1] %= mod;
		add[x << 1 | 1] %= mod;
		sum[x << 1] %= mod;
		sum[x << 1 | 1] %= mod;
		add[x] = 0; mul[x] = 1;
}
inline void Update_add(int L, int R, int C, int l, int r, int x) {
	if(L <= l && R >= r) {
		sum[x] += (r - l + 1) * C;
		add[x] += C;
		sum[x] %= mod;
		add[x] %= mod;
		return ;
	}
	int mid = l + r >> 1;
	PushDown(x, mid - l + 1, r - mid);
	if(L <= mid) Update_add(L, R, C, l, mid, x << 1);
	if(R > mid) Update_add(L, R, C, mid + 1, r, x << 1 | 1);
	PushUp(x);
}
inline void Update_mul(int L, int R, int C, int l, int r, int x) {
	if(L <= l && R >= r) {
		sum[x] *= C;
		add[x] *= C;
		mul[x] *= C;
		sum[x] %= mod;
		add[x] %= mod;
		mul[x] %= mod;
		return ;
	}
	int mid = l + r >> 1;
	PushDown(x, mid - l + 1, r - mid);
	if(L <= mid) Update_mul(L, R, C, l, mid, x << 1);
	if(R > mid) Update_mul(L, R, C, mid + 1, r, x << 1 | 1);
	PushUp(x);
}
inline int Query(int L, int R, int l, int r, int x) {
	if(L <= l && r <= R) {
		return sum[x];
	}
	int mid = l + r >> 1;
	PushDown(x, mid - l + 1, r - mid);
	int ans = 0;
	if(L <= mid) ans += Query(L, R, l, mid, x << 1);
	if(R > mid) ans += Query(L, R, mid + 1, r, x << 1 | 1);
	ans %= mod;
	return ans;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int m, n;
	cin >> n >> m >> mod;
	for(int i = 1; i < N << 2; i ++) mul[i] = 1;
	for(int i = 1; i <= n; i ++)cin >> a[i];
	Build(1, n, 1);
	while(m --) {
		int op, l, r, C;
		cin >> op;
		if(op == 1) {
			cin >> l >> r >> C;
			Update_add(l, r, C, 1, n, 1);
		}
		else if(op == 2){
			cin >> l >> r >> C;
			Update_mul(l, r, C, 1, n, 1);
		}
		else {
			cin >> l >> r;
			cout << Query(l, r, 1, n, 1) % mod<< '\n';
		}
	}
	return 0;
}

2023/1/9 09:17
加载中...