社区讨论
❤性感❤线段树求❤调❤(样例寄了)
P3372【模板】线段树 1参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m2lpbd8p
- 此快照首次捕获于
- 2024/10/23 17:58 去年
- 此快照最后确认于
- 2024/10/23 18:00 去年
rt
CPP#include <bits/stdc++.h>
using namespace std;
using ll=long long;
struct tree{
#define ls (p<<1)
#define rs (p<<1|1)
ll l,r;
ll val,tg;
}t[800005];
ll a[200005],n,q,w;
char ch;
void build(ll l,ll r,ll p){
t[p]={l,r,0,0};
if(l==r){
t[p].val=a[l];
return;
}
ll mid=l+r>>1;
build(l,mid,ls);
build(mid+1,r,rs);
t[p].val=t[ls].val+t[rs].val;
return ;
}
inline void spread(int p){
t[ls].tg+=t[p].tg;
t[rs].tg+=t[p].tg;
t[ls].val+=((t[ls].r-t[ls].l+1)*t[p].tg);
t[rs].val+=((t[rs].r-t[rs].l+1)*t[p].tg);
t[p].tg=0;
return ;
}
inline void update(ll p,ll sx,ll sy,ll k){
if(sx<=t[p].l&&sy>=t[p].r){
t[p].val+=((t[p].r-t[p].l+1)*k);
t[p].tg+=k;
return ;
}
spread(p);
ll mid=t[p].l+t[p].r>>1;
if(sx<=mid) update(ls,sx,sy,k);
if(sy>mid) update(rs,sx,sy,k);
t[p].val=t[ls].val+t[rs].val;
return;
}
ll ans;
inline ll query(int sx,int sy,int p){
if(sx<=t[p].l&&t[p].r<=sy) return t[p].val;
ans=0;
spread(p);
ll mid=t[p].l+t[p].r>>1;
if(sx<=mid) ans+=query(sx,sy,ls);
if(sy>mid) ans+=query(sx,sy,rs);
t[p].val=t[ls].val+t[rs].val;
return ans;
}
inline void read(ll &n){
n=0;
ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while('0'<=ch&&ch<='9'){
n=(n<<3)+(n<<1)+(ch^48);
ch=getchar();
}
return ;
}
ll l,r,d;
int main(){
// freopen("wxyt1.in","r",stdin);
// freopen("wxyt.out","w",stdout);
read(n),read(q);
for(ll i =1 ;i<=n; i++)read(a[i]);
build(1,n,1);
while(q--){
ll opt;
read(opt);
if(opt==1) {
read(l),read(r),read(d);
update(1,l,r,d);
}
else{
read(l),read(r);
cout<<query(l,r,1)<<'\n';
}
}
// freopen("CON","w",stdout);
// system("fc wxyt.out wxyt1.ans");
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...