线段树样例没过求调,玄关
查看原帖
线段树样例没过求调,玄关
1285611
JiangMzz楼主2024/8/8 00:09
#include <bits/stdc++.h>
using namespace std;

int n, q, m;
int a[100001];
int s[400001];
int A[400001];
long long mu[400001];

void push_up(int p) {
	s[p] = s[p * 2] + s[p * 2 + 1];
	return;
}

void build(int p, int l, int r) {//建树 
	if (l == r) {
		s[p] = a[l];
		return;
	}
	int mid = (l + r) / 2;
	build(p * 2, l, mid);
	build(p * 2 + 1, mid + 1, r);
	push_up(p);
}

void push_down(int p, int l, int r) {//下推标记 
	if (A[p] != 0 || mu[p] != 1) {
		mu[p << 1] *= mu[p];
		mu[p << 1 | 1] *= mu[p];
		s[p << 1] *= mu[p];
		s[p << 1 | 1] *= mu[p];
		mu[p] = 1;
		int mid = (l + r) >> 1; 
		A[p * 2] += A[p];
		A[p * 2 + 1] += A[p];
		s[p * 2] += A[p] * (mid - l + 1) * 1ll;//赋值的话直接覆盖即可 
		s[p * 2 + 1] += A[p] * (r - mid) * 1ll;
		A[p] = 0;
	}
	return;
}

long long ask(int l, int r, int L, int R, int p) {//区间查询 
	if (l >= L && r <= R) return s[p];
	int mid = (l + r) >> 1;
	push_down(p, l, r);
	long long ans = 0;
	if (L <= mid) ans += ask(l, mid, L, R, p << 1);
	if (R > mid) ans += ask(mid + 1, r, L, R, p << 1 | 1);
	return ans % m; 
}

void add(int l, int r, int L, int R, int x, int p) {//区间修改add 
	if (l >= L && r <= R) {
		s[p] += x * (r - l + 1);
		A[p] += x;
		return;
	}
	int mid = (l + r) >> 1;
	push_down(p, l, r);
	if (L <= mid) add(l, mid, L, R, x, p << 1);
	if (R > mid) add(mid + 1, r, L, R, x, p << 1 | 1);
	push_up(p);
}

void mul(int l, int r, int L, int R, int k, int p) {//区间修改mul 
	if (l >= L && R >= r) {
		s[p] *= k;
		mu[p] *= k;
		A[p] *= k;
		return;
	}
	int mid = (l + r) >> 1;
	push_down(p, l, r);//?????
	if (L <= mid) mul(l, mid, L, R, k, p << 1);
	if (R > mid) mul (mid + 1, r, L, R, k, p << 1 | 1);
	push_up(p);
}

int main() {
	cin >> n >> q >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		mu[i] = 1;
	}
	for (int i = 1; i <= q; i++) {
		int opt, x, y;
		cin >> opt >> x >> y;
		if (opt == 1) {
			int k;
			cin >> k;
			mul(1, n, x, y, k, 1);
		}
		else if (opt == 2) {
			int k;
			cin >> k;
			add(1, n, x, y, k, 1);
		}
		else {
			long long ans = ask(1, n, x, y, 1);
			cout << ans % m << endl;
		}
	} 
	return 0;
}
2024/8/8 00:09
加载中...