样例未过求调(玄关
查看原帖
样例未过求调(玄关
365113
fly_x楼主2024/7/31 11:11

样例输出: 3 17

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, q, m, a[N];
int add[N*4], mul[N*4], s[N*4];
int op, x, y, k;
void build(int u, int l, int r){
	if (l == r){
		s[u] = a[l] % m;
		return ;
	}
	int mid = (l + r) / 2;
	build(u * 2, l, mid);
	build(u * 2 + 1, mid + 1, r);
	s[u] = s[u*2] + s[u*2+1];
}
void pushdown(int u, int l, int r){
	if (mul[u] != 1){
		s[u*2] *= mul[u], s[u*2+1] *= mul[u]; s[u*2] %= m, s[u*2+1] %= m;
		mul[u*2] *= mul[u], mul[u*2+1] *= mul[u]; mul[u*2] %= m, mul[u*2+1] %= m;
		add[u*2] *= mul[u], add[u*2+1] *= mul[u]; add[u*2] %= m, add[u*2+1] %= m;
		mul[u] = 1;
	}
	if (add[u] != 0){
		int mid = (l + r) / 2;
		s[u*2] += add[u] * (mid-l+1);
		s[u*2+1] += add[u] * (r-mid);
		s[u*2] %= m, s[u*2+1] %= m;
		add[u*2] += add[u], add[u*2+1] += add[u];
		add[u*2] %= m, add[u*2+1] %= m;
		add[u] = 0;
	}
}
void modify(int u, int l, int r, int L, int R, int k, int op) {
	if (l > R || r < L) return;
	if (L <= l && r <= R) {
		if (op == 1){
			s[u] = (s[u] * k) % m;
			mul[u] = (mul[u] * k) % m;
			add[u] = (add[u] * k) % m;
		}else{
			s[u] += k * (r - l + 1), s[u] %= m;
			add[u] += k, add[u] %= m;
		}
		return;
	}
	int mid = (l + r) >> 1;
	pushdown(u, l, r);
	if (L <= mid) modify(u*2, l, mid, L, R, k, op);
	if (R > mid) modify(u*2+1, mid + 1, r, L, R, k, op);
	s[u] = s[u*2] + s[u*2+1], s[u] %= m;
}
int query(int u, int l, int r, int L, int R){
	if (L <= l && r <= R) return s[u];
	int mid = (l + r) / 2, res = 0;
	pushdown(u, l, r);
	if (L <= mid) res += query(u*2, l, mid, L, R);
	if (R > mid) res += query(u*2+1, mid+1, r, L, R);
	return res % m;
}
int main() {
	sizeof(mul, 1, sizeof mul);
	scanf("%d %d %d", &n, &q, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	build(1, 1, n);
	while (q--){
		scanf("%d %d %d", &op, &x, &y);
		if (op != 3){
			scanf("%d", &k);
			modify(1, 1, n, x, y, k, op);
		} 
		if (op == 3) printf("%d\n", query(1, 1, n, x, y));
	}
	return 0;
}

2024/7/31 11:11
加载中...