结构体
struct Tree{
LL l,r,w,f;
};
Tree tree[maxn<<2];
建树
void build(int l,int r,int k){
tree[k].l=l;tree[k].r=r;
if(tree[k].l==tree[k].r){
scanf("%lld",&tree[k].w);
return ;
}
int mid=(l+r)/2;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
懒标记
void down(int k){
tree[k<<1].f+=tree[k].f;
tree[k<<1|1].f+=tree[k].f;
tree[k<<1].w+=(tree[k<<1].r-tree[k<<1].l+1)*tree[k].f;
tree[k<<1|1].w+=(tree[k<<1|1].r-tree[k<<1|1].l+1)*tree[k].f;
tree[k].f=0;
}
点查询
void ask(int x,int k)
{
if(tree[k].l==tree[k].r)
{
ans=tree[k].w;
return ;
}
if(tree[k].f) down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) ask(x,k<<1);
else ask(x,k<<1|1);
}
点更新
void update(int x,int k,int res){
if(tree[k].l==tree[k].r){
tree[k].w+=res;
return ;
}
if(tree[k].f) down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid)update(x,k<<1,res);
else update(x,k<<1|1,res);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
区间查询
void secask(int x,int y,int k){
if(tree[k].l>=x&&tree[k].r<=y){
ans+=tree[k].w;
return ;
}
if(tree[k].f)down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid)secask(x,y,k<<1);
if(y>mid)secask(x,y,k<<1|1);
}
区间更新
void change(int x,int y,int res,int k){
if(tree[k].l>=x&&tree[k].r<=y){
tree[k].w+=(tree[k].r-tree[k].l+1)*res;
tree[k].f+=res;
return ;
}
if(tree[k].f)down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(x<=mid)change(x,y,res,k<<1);
if(y>mid)change(x,y,res,k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}