社区讨论
线段树1求条
灌水区参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m5tbrb9u
- 此快照首次捕获于
- 2025/01/12 15:59 去年
- 此快照最后确认于
- 2025/11/04 11:43 4 个月前
C
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+7;
ll n,root=1,q;
struct Node{
ll l,r,v,t;
} tr[N<<2];
ll a[N];
ll pushup(ll u){
tr[u].v=tr[u<<1].v+tr[u<<1|1].v;
return 0;
}
ll build(ll u,ll l,ll r){
tr[u].l=l;
tr[u].r=r;
if(l==r){
tr[u].v=a[l];
return 0;
}
ll mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
return 0;
}
ll calc(ll u,ll d){
tr[u].v+=(tr[u].r-tr[u].l+1)*d;
tr[u].t+=d;
}
ll pushdown(ll u){
calc(u<<1,tr[u].t);
calc(u<<1|1,tr[u].t);
tr[u].t=0;
}
ll modify(ll u,ll l,ll r,ll v){
if(l<=tr[u].l&&tr[u].r<=r){
calc(u,v);
return 0;
}
ll mid=tr[u].l+tr[u].r>>1;
pushdown(u);
if(l<=mid){
modify(u<<1,l,r,v);
}
if(r>=mid+1){
modify(u<<1|1,l,r,v);
}
pushup(u);
return 0;
}
ll query(ll u,ll l,ll r){
if(l<=tr[u].l&&tr[u].r<=r){
return tr[u].v;
}
ll mid=tr[u].l+tr[u].r>>1;
pushdown(u);
ll res=0;
if(l<=mid){
res+=query(u<<1,l,r);
}
if(r>=mid+1){
res+=query(u<<1|1,l,r);
}
return res;
}
int main(){
cin>>n>>q;
for(ll i=1;i<=n;++i){
cin>>a[i];
}
build(root,1,n);
for(ll o,l,r,k;q--;){
cin>>o>>l>>r;
if(o==1){
cin>>k;
modify(root,l,r,k);
}
if(o==2){
cout<<query(root,l,r)<<endl;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...