线段树模板 2 求调
查看原帖
线段树模板 2 求调
804757
Light_Star_RPmax_AFO楼主2023/8/24 22:12
#include <bits/stdc++.h>
#define ll long long
#define ls (p << 1)
#define rs ((p << 1) | 1)
using namespace std;

inline ll read(){
	int f = 1;
	ll x = 0;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-')f = -1;
		ch = getchar();
	}
	while(isdigit(ch)){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
inline void print(ll x){
	if(x > 9)print(x / 10);
	putchar(x % 10 + '0');
}

ll a[100010], laze1[400010], d[400010], laze2[400010], mod;

inline void push_up(ll p){
	d[p] = (d[ls] + d[rs]) % mod;
}

inline void build(ll s, ll t, ll p){
	laze1[p] = 0;
	laze2[p] = 1;
	if(s == t){
		d[p] = a[s];
		return;
	}
	ll mid = s + ((t - s) >> 1);
	build(s, mid, ls);
	build(mid + 1, t, rs);
	push_up(p);
}

inline void push_down(ll s, ll t, ll p){
	ll mid = s + ((t - s) >> 1);
	laze1[ls] = (laze1[ls] * laze2[p] + laze1[p]) % mod;
	laze2[ls] = (laze2[ls] * laze2[p]) % mod;
	laze1[rs] = (laze1[rs] * laze2[p] + laze1[p]) % mod;
	laze2[rs] = (laze2[rs] * laze2[p]) % mod;
	d[ls] = (d[ls] * laze2[p] % mod + laze1[p] * (mid - s + 1) % mod) % mod;
	d[rs] = (d[rs] * laze2[p] % mod + laze1[p] * (t - mid) % mod) % mod;
	laze1[p] = 0;
	laze2[p] = 1;
	return ;
}

inline void update1(ll l, ll r, ll c, ll s, ll t, ll p){
	if(l <= s && t <= r){
		d[p] += (t - s + 1) * c % mod, laze1[p] = (laze1[p] + c) % mod;
		return ;
	}
	push_down(s, t, p);
	ll mid = s + ((t - s) >> 1);
	if(l <= mid)update1(l, r, c, s, mid, ls);
	if(r > mid)update1(l, r, c, mid + 1, t, rs);
	push_up(p);
}

inline ll getsum(ll l, ll r, ll s, ll t, ll p){
	if(l <= s && t <= r)
		return d[p];
	ll mid = s + ((t - s) >> 1), sum = 0;
	push_down(s, t, p);
	if(l <= mid)sum = getsum(l, r, s, mid, ls) % mod;
	if(r > mid)sum = (sum + getsum(l, r, mid + 1, t, rs)) % mod;
	return sum;
}

inline void update2(ll l, ll r, ll c, ll s, ll t, ll p){
	if(l <= s && t <= r){
		d[p] = d[p] * c % mod, laze1[p] = laze1[p] * c % mod, laze2[p] = laze2[p] * c % mod;
		return ;
	}
	push_down(s, t, p);
	ll mid = s + ((t - s) >> 1);
	if(l <= mid)update2(l, r, c, s, mid, ls);
	if(r > mid)update2(l, r, c, mid + 1, t, rs);
	push_up(p);
}

signed main(){
	ll n = read(), q = read();
	mod = read();
	for(ll i = 1;i <= n;i++)
		a[i] = read() % mod;
	build(1, n, 1);
	while(q--){
		ll op = read();
		if(op == 1){
			ll x = read(), y = read(), k = read();
			update1(x, y, k, 1, n, 1);
		}else{
			if(op == 2){
				ll x = read(), y = read(), k = read();
				update2(x, y, k, 1, n, 1);
			}else{
				ll x = read(), y = read();
				print(getsum(x, y, 1, n, 1)), putchar('\n');
			}
		}
	}
	return 0;
}
2023/8/24 22:12
加载中...