线段树自用模板

include <stdio.h>

include <string.h>

define ll long long

void pushup(ll rt)
{
sum[rt]=sum[re<<1]+sum[rt<<1|1];
}
void build(ll l,ll r,ll x)//建树
{
if (lr)
{
sum[rt]=a[l];
return;
}
ll mid=(l+r)>>1;
build(l,mid,x<<1);
build(mid+1,r,x<<1|1);
//更新信息
pushup(x);
}
//点修改
void update(ll L,ll c,ll l,ll r,ll x)
{
if (l
r)
{
sum[x]+=c;
return;
}
ll mid=(l+r)>>1;
if (L<=mid)
update(L,c,l,mid,x<<1);
else
update(L,c,mid+1,r,x<<1|1);

pushup(x);

}
//区间修改
void update(ll x,ll y,ll c ,ll l,ll r,ll x)
{
if (x<=l&&y<=r)
{
sum[x]+=c*(r-l+1);
lazy[x]+=c;
return;
}
ll mid=(l+r)>>1;
pushdown(x,mid-l+1,r-mid);//?下准标记?

if (x<=mid)
	update(x,y,c,l,mid,x<<1);
if (y>mid)
	update(x,y,c,mid+1,r,x<<1|1);

}
//区间查询
void pushdown(ll x,ll ln,ll rn)//下推标记函数
{
if (lazy[x])
{
lazy[x<<1]+=lazy[x];
lazy[x<<1|1]+=lazy[x];
//修改子节点的Sum使之与对应的Add相对应
sum[x<<1]+=lazy[x]ln;
sum[x<<1|1]+=lazy[x]
rn;

	lazy[x]=0;
}

}
//查询
int query(ll L,ll R,ll l,ll r,ll x)
{
if (L<=l&&r<=R)
return sum[x];

ll mid=(l+r)>>1;
//下推标记,否则Sum可能不正确
pushdowm(x,mid-l+1,r-mid);//

ll sum=0;
if (L<=mid)
sum+=query(L,R,l,mid,x<<1);
if (R>m)
sum+=query(L,R,mid+1,r,x<<1|1);
return sum;

}

原文地址:https://www.cnblogs.com/shidianshixuan/p/13734134.html