变量声明
//结构体
struct segment_tree
{
ll l, r,sum,lz;
}t[N<<2];//开大约四倍;
int a[N];//点信息;
上升和下沉
void pushup(i){
...};
void pushdown(i){
...};
建树
// 建树
void build(int i,int l,int r)
{
t[i].l = l,t[i].r = r;
if(l == r){
t[i].sum = a[l];
return ;
}
int mid = (l+r) >> 1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(i);
}
修改
// 区间修改;
void update(int i,l,r,k)// k 变量;
{
if(t[i].l >= l && t[i].r <= r){
t[i].sum += k*(t[i].r - t[i].l+1);
t[i].lz += k;
return ;
}
pushdown(i);
if(t[lc].r >= l) update(lc,l,r,k);
if(t[rc].l <= r) update(rc,l,r,k);
pushup(i);
}
查询
ll query(int i,int l, int r)
{
if(t[i].l >= l && t[i].r <= r){
return t[i].sum;
}
if(t[i].r <l || t[i].l > r ) return 0;
pushdown(i);
ll s = 0;
if(t[lc].r >= l) s += query(lc,l,r);
if(t[rc].l <= r) s+= query(rc,l,r);
return s;
}