蒟蒻求调(玄关)
查看原帖
蒟蒻求调(玄关)
589190
YLgiegie楼主2024/7/27 17:16

把线段树1的代码改了改交上去为什么没过啊。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5 +10;
ll n , m , q;
ll p;
ll a[N];
struct node{
	ll num;
	ll ls , rs;
	ll lazy;
	ll laza;
}tr[N<<2];
#define lson tr[rt].ls
#define rson tr[rt].rs
#define mid (lson + rson) >> 1
void build(ll rt , ll l , ll r) {
	lson = l;
	rson = r;
	if(l == r) {
		tr[rt].num = a[l];
		return;
	}
	build(rt << 1 , l , (mid));
	build(rt << 1 | 1, (mid) + 1 , r);
	tr[rt].num = tr[rt << 1].num + tr[rt << 1 | 1].num;
	tr[rt].num %= p;
}
void push(ll rt) {
	ll lazy = tr[rt].lazy;
	ll laza = tr[rt].laza;
	if(lazy) {
		tr[rt << 1].num = lazy * tr[rt << 1].num + (tr[rt << 1].rs - tr[rt << 1].ls + 1) * laza;
		tr[rt << 1].lazy *= lazy;
		tr[rt << 1].laza = (tr[rt << 1].laza*lazy+laza);
		tr[rt << 1].num %= p;
		tr[rt << 1].lazy %= p;
		tr[rt << 1].laza %= p; 
		tr[rt << 1 | 1].num = lazy * tr[rt << 1 | 1].num + (tr[rt << 1 | 1].rs - tr[rt << 1 | 1].ls + 1) * laza;
		tr[rt << 1 | 1].lazy *= lazy;
		tr[rt << 1 | 1].laza = (tr[rt << 1].laza*lazy+laza);
		tr[rt << 1 | 1].num %= p;
		tr[rt << 1 | 1].lazy %= p;
		tr[rt << 1 | 1].laza %= p; 
		tr[rt].lazy = 1, tr[rt].laza = 0;
	}
}

void update(ll rt , ll l , ll r , ll v) {
	if(l <= lson && r >= rson) {
		tr[rt].num += v * (rson - lson + 1) % p;
		tr[rt].num %= p;
		tr[rt].laza += v;
		tr[rt].laza %= p;
		return;
	}
	push(rt);
	if(l <= mid) update(rt << 1 , l , r , v);
	if(r > mid) update(rt << 1 | 1 , l , r , v);
	tr[rt].num = tr[rt << 1].num + tr[rt << 1 | 1].num;
	tr[rt].num %= p;
}
void updata(ll rt , ll l , ll r , ll v) {
	if(l <= lson && r >= rson) {
		tr[rt].laza *= v;
		tr[rt].lazy *= v;
		tr[rt].num *= v;
		tr[rt].laza %= p;
		tr[rt].lazy %= p;
		tr[rt].num %= p;
		return;
	}
	push(rt);
	if(l <= mid) updata(rt << 1 , l , r , v);
	if(r > mid) updata(rt << 1 | 1 , l , r , v);
	tr[rt].num = tr[rt << 1].num + tr[rt << 1 | 1].num;
	tr[rt].num %= p;
}
ll query(ll rt , ll l , ll r) {
	if(l <= lson && r >= rson) return tr[rt].num;
	push(rt);
	ll ans = 0;
	if(l <= mid) ans += query(rt << 1 , l , r) % p;
	if(r > mid) ans += query(rt << 1 | 1 , l , r) % p;
	return ans % p;
}
int main() {
	scanf("%lld%lld%lld" , &n , &m , &p);
	for(int i = 1; i <= n ; i++) {
		scanf("%lld" , &a[i]);
	}
	build(1 , 1 , n);
	while(m--) {
		ll op , x , y , h;
		scanf("%lld" , &op);
		if(op-1) {
			if(op&1) {
				scanf("%lld%lld" , &x , &y);
				printf("%lld\n" , query(1 , x , y));
			}
			else {
				scanf("%lld%lld%lld" , &x , &y , &h);
				update(1 , x , y , h);
			}
		}
		else {
			scanf("%lld%lld%lld" , &x , &y , &h);
			updata(1 , x , y , h);
		}
	}
}
2024/7/27 17:16
加载中...