求助,三十分
查看原帖
求助,三十分
534800
管泽昊1691楼主2021/10/4 19:23
#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N = 1e7 + 9;

ll n,m;
ll p;
ll tree[N];
ll a[N];
ll tag[N];
ll gag[N];

inline ll ls(ll p){
	return p << 1;
}

inline ll rs(ll p){
	return p << 1 | 1;
}

void build(ll wei,ll l,ll r){
	tag[wei] = 0;
	gag[wei] = 1;
	if(l >= r){
		tree[wei] = a[l];
		return;
	}
	
	ll mid = (r + l) >> 1;
	build(ls(wei),l,mid);
	build(rs(wei),mid + 1,r);
	tree[wei] = tree[ls(wei)] + tree[rs(wei)];
	
}

inline void f(ll wei,ll l,ll r,ll k,ll w){
	tree[wei] *= w % p;
	tree[wei] %= p;
	tree[wei] += (r - l + 1) * k % p;
	
	tag[wei] += k % p;
	gag[wei] *= w % p;
}

inline void push_down(ll wei,ll l,ll r){
	ll mid = (r + l) >> 1;
	f(ls(wei),l,mid,tag[wei],gag[wei]);
	f(rs(wei),mid + 1,r,tag[wei],gag[wei]);
	tag[wei] = 0;
	gag[wei] = 1;
}

void update(ll nl,ll nr,ll l,ll r,ll wei,ll k){
	if(nl <= l && r <= nr){
		tree[wei] += (r - l + 1) * k % p;
		tree[wei] %= p;
		tag[wei] += k % p;
		return;
	}
	
	push_down(wei,l,r);
	ll mid = (r + l) >> 1;
	if(nl <= mid) update(nl,nr,l,mid,ls(wei),k);
	if(nr > mid) update(nl,nr,mid + 1,r,rs(wei),k);
	tree[wei] = tree[ls(wei)] % p + tree[rs(wei)] % p;
	
}


void cheng(ll nl,ll nr,ll l,ll r,ll wei,ll k){
	if(nl <= l && r <= nr){
		tree[wei] *= k % p;
		tag[wei] *= k % p;
		gag[wei] *= k % p;
		tree[wei] %= p;
		tag[wei] %= p;
		gag[wei] %= p;
		return;
	}
	
	push_down(wei,l,r);
	ll mid = (r + l) >> 1;
	if(nl <= mid) cheng(nl,nr,l,mid,ls(wei),k);
	if(nr > mid) cheng(nl,nr,mid + 1,r,rs(wei),k);
	tree[wei] = tree[ls(wei)] % p + tree[rs(wei)] % p;
	
}

ll query(ll nl,ll nr,ll l,ll r,ll wei){
	ll res = 0;
	if(nl <= l && nr >= r) return tree[wei];
	
	push_down(wei,l,r);
	ll mid = (r + l) >> 1;
	if(nl <= mid) res += query(nl,nr,l,mid,ls(wei));
	if(nr > mid) res += query(nl,nr,mid + 1,r,rs(wei));
	return res;	
}

int main(){
	cin >> n >> m >> p;
	
	for(int i = 1;i <= n;i ++){
		cin >> a[i];
	}
	
	build(1,1,n);
	ll pan;
	for(int i = 1;i <= m;i ++){				
		cin >> pan;
		if(pan == 2){
			ll x,y,w;
			scanf("%lld%lld%lld",&x,&y,&w);
			update(x,y,1,n,1,w);
		}else if(pan == 1){
			ll x,y,w;
			scanf("%lld%lld%lld",&x,&y,&w);
			cheng(x,y,1,n,1,w);
		}else if(pan == 3){
			ll x,y;
			scanf("%lld%lld",&x,&y);	
			printf("%lld\n",query(x,y,1,n,1) % p);
		}
	}	
}
2021/10/4 19:23
加载中...