struct node {
int l,r,data;
int lt;
}t[1000010];
int a[1000010];
void build(int l,int r,int i,int a[])
{
t[i].lt=0;
t[i].l=l;
t[i].r=r;
if(l==r) {
t[i].data=a[l];
return ;
}//为根节点时。
int mid=(l+r)>>1;
build(l,mid,i*2,a);
build(mid+1,r,i*2+1,a);
t[i].data=t[i*2].data+t[i*2+1].data;
}//建树
void push_down(int i)
{
if(t[i].lt!=0) {
t[i*2].lt+=t[i].lt;
t[i*2+1].lt+=t[i].lt;
int mid=(t[i].l+t[i].r)>>1;
t[i*2].data+=t[i].lt*(mid-t[i*2].l+1);
t[i*2+1].data+=t[i].lt*(t[i*2+1].r-mid);//r-(mid+1)+1;
t[i].lt=0;
}
}
void update(int i,int l,int r,int k)
{
if(t[i].r<=r && t[i].l>=l){
t[i].data+=k*(t[i].r-t[i].l+1);
t[i].lt+=k;//记得加上懒标记。
return ;
}//完全包括
push_down(i);
if(t[i*2].r>=l) {
update(i*2,l,r,k);
}
if(t[i*2+1].l<=r) {
update(i*2+1,l,r,k);
}
t[i].data=t[i*2].data+t[i*2+1].data;
}
int search (int i,int l,int r)
{
if(t[i].l>=l && t[i].r<=r){
return t[i].data;
}
push_down(i);
int num=0;
if(t[i*2].r>=l ){
num+=search(i*2,l,r);
}
if(t[i*2+1].l<=r) {
num+=search(i*2+1,l,r);
}
return num;;
}
这里是一个基础的线段树模板。 包括区间修改,区间查询功能。