30求调
查看原帖
30求调
702221
Fusiyi楼主2025/1/15 10:03
#include <bits/stdc++.h>
using namespace std;

const int N = 1e7 + 5;
long long n, m, q, l, r, k, f;
long long a[N];
struct P{
	long long x, tag, tag2;
};
P s[N];

void release(int x, int l, int r){
	int mid = (l + r) / 2;
	s[x * 2].x = ((s[x * 2].x * s[x].tag2) % q + ((mid - l + 1) * s[x].tag) % q) % q;
	s[x * 2 + 1].x = ((s[x * 2 + 1].x * s[x].tag2) % q + ((r - mid) * s[x].tag) % q) % q;
	
	s[x * 2].tag = (s[x * 2].tag + s[x].tag) % q;
	s[x * 2 + 1].tag = (s[x * 2 + 1].tag + s[x].tag) % q;
	
	s[x * 2].tag2 = (s[x * 2].tag2 * s[x].tag2) % q;
	s[x * 2 + 1].tag2 = (s[x * 2 + 1].tag2 * s[x].tag2) % q;
	
	s[x].tag = 0, s[x].tag2 = 1;
}

void js(int x, int l, int r){
	s[x].tag2 = 1;
	if(l == r){
		s[x].x = a[l] % q;
		return;
	}
	int mid = (l + r) / 2;
	js(x * 2, l, mid), js(x * 2 + 1, mid + 1, r);
	s[x].x = (s[x * 2].x + s[x * 2 + 1].x) % q;
}

void tj1(int x, int l, int r, int ll, int rr, long long k){
	if(ll <= l && r <= rr){
		s[x].x = (s[x].x + (k * (r - l + 1)) % q) % q;
		s[x].tag = (s[x].tag + k) % q;
		return;
	}
	release(x, l, r);
	int mid = (l + r) / 2;
	if(ll <= mid) tj1(x * 2, l, mid, ll, rr, k);
	if(mid < rr) tj1(x * 2 + 1, mid + 1, r, ll, rr, k);
	s[x].x = (s[x * 2].x + s[x * 2 + 1].x) % q;
}

void tj2(int x, int l, int r, int ll, int rr, long long k){
	if(ll <= l && r <= rr){
		s[x].x = (s[x].x * k) % q;
		s[x].tag2 = (s[x].tag2 * k) % q;
		s[x].tag = (s[x].tag * k) % q;
		return;
	}
	release(x, l, r);
	int mid = (l + r) / 2;
	if(ll <= mid) tj2(x * 2, l, mid, ll, rr, k);
	if(mid < rr) tj2(x * 2 + 1, mid + 1, r, ll, rr, k);
	s[x].x = (s[x * 2].x + s[x * 2 + 1].x) % q;
}

long long print(int x, int l, int r, int ll, int rr){
	if(ll <= l && r <= rr){
		return s[x].x % q;
	}
	release(x, l, r);
	int mid = (l + r) / 2;
	long long sum = 0;
	if(ll <= mid) sum = (sum + print(x * 2, l, mid, ll, rr)) % q;
	if(mid < rr) sum = (sum + print(x * 2 + 1, mid + 1, r, ll, rr)) % q;
	return sum % q;
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

	cin >> n >> m >> q;
	for(int i = 1; i <= n; i ++){
		cin >> a[i];
	}
	js(1, 1, n);
	while(m --){
		cin >> f >> l >> r;
		if(f == 2){
			cin >> k;
			tj1(1, 1, n, l, r, k);
		}
		else if(f == 1){
			cin >> k;
			tj2(1, 1, n, l, r, k);
		}
		else{
			cout << print(1, 1, n, l, r) % q << '\n';
		}
	}

    return 0;
}
2025/1/15 10:03
加载中...