社区讨论
求助
P3372【模板】线段树 1参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7ygu1n
- 此快照首次捕获于
- 2025/11/21 05:40 4 个月前
- 此快照最后确认于
- 2025/11/21 05:40 4 个月前
CPP
#include<iostream>
#include<cstdio>
#define MAXN 1000100
using namespace std;
typedef long long ll;
ll n,m,a[MAXN],b[MAXN],tree[MAXN];
inline ll read(){
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();};
while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();};
return x*f;
}
inline void lx(ll k,ll root,ll l,ll r){
b[root]=b[root]+k;
tree[root]=tree[root]+k*(r-l+1);
}
inline void build(ll l,ll r,ll root){
b[root]=0;
if(l==r){
tree[root]=a[l];
return ;
}
ll mid=(l+r)>>1;
build(l,mid,root*2);
build(mid+1,r,root*2+1);
tree[root]=tree[root*2]+tree[root<<1|1];
return ;
}
inline void pushdown(ll root,ll l,ll r){
/*if(b[root]==0){
return ;
}*/
ll mid=(l+r)>>1;
/*b[root<<1]+=b[root];
tree[root<<1]+=b[root]*(mid-l+1);
b[root<<1|1]+=b[root];
tree[root<<1|1]+=b[root]*(r-(mid+1)+1);*/
lx(b[root],root<<1,l,mid);
lx(b[root],root<<1|1,mid+1,r);
b[root]=0;
return ;
}
inline void add(ll l,ll r,ll k,ll x,ll y,ll root){
if(l<=x&&r>=y){
tree[root]+=k*(x-y+1);
//b[root*2]+=k;
//b[root*2+1]+=k;
b[root]+=k;
return ;
}
pushdown(root,x,y);
ll mid=(x+y)>>1;
if(l<=mid){
add(l,r,k,x,mid,root<<1);
}
if(r>mid){
add(l,r,k,mid+1,y,root<<1|1);
}
tree[root]=tree[root*2]+tree[root<<1|1];
return ;
}
inline ll que(ll x,ll y,ll l,ll r,ll root){
ll ans=0;
if(l<=x&&y<=r){
return tree[root];
}
pushdown(root,x,y);
ll mid=(x+y)>>1;
if(l<=mid){
ans+=que(x,mid,l,r,root<<1);
}
if(r>mid){
ans+=que(mid+1,y,l,r,root<<1|1);
}
return ans;
}
int main(){
int i,j;
n=read();m=read();
for(i=1;i<=n;i++){
a[i]=read();
}
build(1,n,1);
int f;
ll x,y,k;
for(i=1;i<=m;i++){
f=read();x=read();y=read();
if(f==1){
k=read();
add(x,y,k,1,n,1);
}else{
printf("%lld\n",que(1,n,x,y,1));
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...