社区讨论
0分求调,违规紫衫
P3373【模板】线段树 2参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjuyzg7
- 此快照首次捕获于
- 2025/11/04 08:56 4 个月前
- 此快照最后确认于
- 2025/11/04 08:56 4 个月前
CPP
#include <iostream>
#define int long long
using namespace std;
const int N = 1e7 + 5;
struct qq{
int l,r;
long long ad,va,sum;
}tr[N];
int n,m,q,a[N];
void push_up (int u) {
tr[u].sum = (tr[u << 1].sum + tr[u << 1 | 1].sum) % m;
return ;
}
void push_down (int u) {
tr[u << 1].sum = (tr[u << 1].sum * tr[u].va + tr[u].ad * (tr[u << 1].r - tr[u << 1].l + 1)) % m;
tr[u << 1 | 1].sum = (tr[u << 1 | 1].sum * tr[u].va + tr[u].ad * (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1)) % m;
tr[u << 1].va = (tr[u].va * tr[u << 1].va) % m;
tr[u << 1 | 1].va = (tr[u].va * tr[u << 1 | 1].va) % m;
tr[u << 1].ad = (tr[u].va * tr[u << 1].ad + tr[u].ad) % m;
tr[u << 1 | 1].ad = (tr[u].va * tr[u << 1 | 1].ad + tr[u].ad) % m;
tr[u].ad = 0;
tr[u].va = 1;
}
void build (int u,int l,int r) {
tr[u].l = l;
tr[u].r = r;
tr[u].va = 1;
if (l == r) {
tr[u].sum = a[l] % m;
return ;
}
int mid = (l + r) >> 1;
build (u << 1,l,mid);
build (u << 1 | 1,mid + 1,r);
push_up (u);
}
void add (int u,int l,int r,int k) {
if (l <= tr[u].l && tr[u].r <= r) {
tr[u].ad = (tr[u].ad + k) % m;
tr[u].sum = (tr[u].sum + k * (tr[u].r - tr[u].l + 1)) % m;
return ;
}
push_down (u);
int mid = (tr[u].l + tr[u].r) >> 1;
if (l <= mid) add (u << 1,l,r,k);
if (r > mid) add (u << 1 | 1,l,r,k);
push_up (u);
}
void val (int u,int l,int r,int k) {
if (l <= tr[u].l && tr[u].r <= r) {
tr[u].ad = (tr[u].ad * k) % m;
tr[u].va = (tr[u].va * k) % m;
tr[u].sum = (tr[u].sum * k) % m;
return ;
}
push_down (u);
int mid = (tr[u].l + tr[u].r) >> 1;
if (l <= mid) val (u << 1,l,r,k);
if (r > mid) val (u << 1 | 1,l,r,k);
push_up (u);
}
int query (int u,int l,int r) {
if (l <= tr[u].l && tr[u].r <= r) return tr[u].sum;
int ans = 0;
int mid = (tr[u].l + tr[u].r) >> 1;
push_down (u);
if (l <= mid) ans = (ans + query (u << 1,l,r)) % m;
if (r > mid) ans = (ans + query (u << 1 | 1,l,r)) % m;
return ans;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q >> m;
for (int i = 1;i <= n;i ++) cin >> a[i];
build (1,1,n);
while (q --) {
int op;
cin >> op;
if (op == 1) {
int x,y,k;
cin >> x >> y >> k;
val (1,x,y,k);
} else if (op == 2) {
int x,y,k;
cin >> x >> y >> k;
add (1,x,y,k);
} else {
int x,y;
cout << query (1,x,y) << '\n';
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...