社区讨论
0pts求条
P3373【模板】线段树 2参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mibmagqq
- 此快照首次捕获于
- 2025/11/23 19:10 4 个月前
- 此快照最后确认于
- 2025/11/23 20:16 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define ll long long
#define LC 2*cur
#define RC 2*cur+1
ll a[N];
int mod;
struct Node{
int l,r;
ll value,tag,mul;
int len(){
return r-l+1;
}
}tree[N*4];
void pushup(int cur){
tree[cur].value=tree[LC].value+tree[RC].value;
}
void build(int cur,int l,int r){
tree[cur].l=l,tree[cur].r=r;
if(l==r){
tree[cur].value=a[l];
return;
}
int mid=(l+r)/2;
build(LC,l,mid);
build(RC,mid+1,r);
pushup(cur);
}
void work(int cur,ll delta,int op){
if(op==2){
tree[cur].value+=(tree[cur].len()*delta);
tree[cur].tag+=delta;
}
else{
tree[cur].value=tree[cur].value*delta%mod;
tree[cur].mul*=delta,tree[cur].tag*=delta;
}
}
void pushdown(int cur){
if(tree[cur].mul>0){
work(LC,tree[cur].mul,1),work(RC,tree[cur].mul,1);
tree[cur].mul=0;
}
if(tree[cur].tag>0){
work(LC,tree[cur].tag,2),work(RC,tree[cur].tag,2);
tree[cur].tag=0;
}
}
void update(int cur,int l,int r,ll delta,int op){
if(l<=tree[cur].l&&r>=tree[cur].r){
work(cur,delta,op);
return;
}
pushdown(cur);
int mid=(tree[cur].r+tree[cur].l)/2;
if(mid>=l)update(LC,l,r,delta,op);
if(mid<r)update(RC,l,r,delta,op);
pushup(cur);
}
ll query(int cur,int l,int r){
if(l<=tree[cur].l&&r>=tree[cur].r)return tree[cur].value;
pushdown(cur);
ll ans=0;
int mid=(tree[cur].r+tree[cur].l)/2;
if(mid>=l)ans=(ans+query(LC,l,r))%mod;
if(mid<r)ans=(ans+query(RC,l,r))%mod;
return ans;
}
int n,m;
int main(){
cin >> n >> m >> mod;
for(int i=1;i<=n;i++){
cin >> a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y;
ll k;
cin >> op >> x >> y;
if(op<=2){
cin >> k;
update(1,x,y,k,op);
}
else {
cout << query(1,x,y) << '\n';
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...