0ptsWA求调
查看原帖
0ptsWA求调
518500
Ted_LightningTechG_楼主2024/1/13 13:16

Rt.

#include<bits/stdc++.h>
#define ll long long
#define mul tree[k].mul_lzy
#define pls tree[k].pls_lzy
#define lson (k << 1)
#define rson (k << 1 | 1)

const int MAX = 100000;
int n, q;
ll a[MAX+5], z, mod;
int opt, x, y;

struct Segment_Tree{
	struct Tree{
		int l, r;
		ll sum, pls_lzy, mul_lzy = 1;
	}tree[MAX << 2];
	
	inline void push_down(int k) {
		tree[lson].sum = (tree[lson].sum * mul % mod + pls * (tree[lson].r - tree[lson].l + 1) % mod) % mod;
		tree[rson].sum = (tree[rson].sum * mul % mod + pls * (tree[rson].r - tree[rson].l + 1) % mod) % mod;
		tree[lson].mul_lzy = tree[lson].mul_lzy * mul % mod;
		tree[rson].mul_lzy = tree[rson].mul_lzy * mul % mod;
		tree[lson].pls_lzy = (tree[lson].pls_lzy * mul % mod + pls) % mod;
		tree[rson].pls_lzy = (tree[rson].pls_lzy * mul % mod + pls) % mod;
		pls = 0, mul = 1;
	}
	
	inline void build(int k, int l, int r) {
		tree[k].l = l, tree[k].r = r;
		if(l == r) {
			tree[k].sum = a[l] % mod;
			return ;
		}
		int mid = l + r >> 1;
		build(lson, l, mid);
		build(rson, mid + 1, r);
		tree[k].sum = (tree[lson].sum + tree[rson].sum) % mod;
	}
	
	inline void pls_update(int k, int l, int r, ll num) {
		if(tree[k].l >= l && tree[k].r <= r) {
			tree[k].sum = (tree[k].sum + num * (tree[k].r - tree[k].l + 1) % mod) % mod;
			pls = (pls + num) % mod;
			return;
		}
		push_down(k);
		if(l <= tree[lson].r) pls_update(lson, l, r, num);
		if(r >= tree[rson].l) pls_update(rson, l, r, num);
		tree[k].sum = (tree[lson].sum + tree[rson].sum) % mod;
	}
	
	inline void mul_update(int k, int l, int r, ll num) {
		if(tree[k].l >= l && tree[k].r <= r) {
			tree[k].sum = tree[k].sum * num % mod;
			mul = mul * num % mod;
			return;
		}
		push_down(k);
		if(l <= tree[lson].r) mul_update(lson, l, r, num);
		if(r >= tree[rson].l) mul_update(rson, l, r, num);
		tree[k].sum  = (tree[lson].sum + tree[rson].sum) % mod;
	}
	
	inline ll query(int k, int l, int r) {
		if(tree[k].l >= l && tree[k].r <= r) return tree[k].sum;
		push_down(k);
		ll sum = 0;
		if(l <= tree[lson].r) sum = (sum + query(lson, l, r)) % mod;
		if(r >= tree[rson].l) sum = (sum + query(rson, l, r)) % mod;
		return sum;
	}
}S_Tree;
int main() {
	std::cin >> n >> q >> mod;
	for(int i = 1; i <= n; i ++) std::cin >> a[i];
	S_Tree.build(1, 1, n);
	while(q --> 0) {
		std::cin >> opt >> x >> y;
		if(opt == 1) {
			std::cin >> z;
			S_Tree.mul_update(1, x, y, z);
		}
		else if(opt == 2) {
			std::cin >> z;
			S_Tree.pls_update(1, x, y, z);
		}
		else {
			std::cout << S_Tree.query(1, x, y) <<'\n';
		}
	}
	return 0;
}

样例过了

2024/1/13 13:16
加载中...