线段树自用模板

include <string.h>

include <stdio.h>

include

using namespace std;
int n,m,a[110000],lazy[110000];
void build(int x,int l,int r)//
{
if (lr)
{
tree[x];
return ;
}
int mid=(l+r)/2;
build(x2,l,mid);
build(x
2+1,mid+1,r);
tree[x]=tree[x2]+tree[x2+1];
}
//单点修改
void update(int w,int c,int l,int r,int x) //w为更新点,c为更新值
{
if (l
r)
{
tree[x]+=c;
}
int mid=(l+r)/2;
if (w<=mid)
update(w,c,l,mid,x2);
else
update(w,c,mid+1,r,x
2+1);
tree[x]=tree[x2]+tree[x2+1];//回溯
}
//lazy标记
void pushdown(int x,int l,int r)
{
if (lazy[x])
{
int mid=(l+r)/2;
lazy[x2]+=lazy[x];
lazy[x
2+1]+=lazy[x];

	tree[x*2]+=lazy[x]*(mid-l+1);
	tree[x*2+1]+=lazy[x]*(r-mid);
	lazy[x]=0;
}

}
//区间更新
//add为更新值,L,R为更新范围,l,r为线段树范围
void update_range(int add,int L,int R,int l,int r,int x)
{
if (L<=l&&R>=r)
{
lazy[x]+=add;
tree[x]+=(r-l+1)*add;
return;
}
push_down(x,l,r);

int mid=(l+r)/2;
if (mid>=L)
	update_down(add,L,R,l,r,x*2);
if (mid<R)
	update_down(add,L,R,l,r,x*2+1);
tree[x]=tree[x*2]+tree[x*2+1];

}
//区间查找
long long query_range(int x,int L,int R,int l,int r)
{
if (L<=l&&R>=r)
return tree[x];
push_down(x,l,r);

int mid=(l+r)/2;
long long sum=0;
 if (mid>=L)
 sum+=query_range(x*2,L,R,l,mid);
 if (mid<R)
 sum+=query_range(x*2+1,L,R,mid+1,r);
return sum;

}

int main()
{
int i,j;
while(~scanf ("%d%d",&n,&m)&&n&&m)
{
int x,z,y;
for (i=0; i<n; i++)
{
scanf ("%d%d%d",&x,&y,&z);
build(x,y,z);
}
}
return 0;
}

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