模板-----------线段树的区间修改,区间查询

洛谷3372

#include
#include
#include
#define re register
#define inl inline
#define LL long long
const int MAXN=2e5+5;
LL f[4*MAXN],a[MAXN],add[4*MAXN];
LL ans,m,n;
inl void build(LL num,LL l,LL r)
{
	if(l==r)
	{
		f[num]=a[l];
		return;
	}
	LL mid=(l+r)>>1;
	build(num*2,l,mid);
	build(num*2+1,mid+1,r);
	f[num]=f[num*2]+f[num*2+1];
}
inl void add_tag(LL num,LL l,LL r,LL tag)
{
	add[num]+=tag;
	f[num]+=(r-l+1)*tag;
	return;
}
inl void pushdown(LL num,LL l,LL r,LL mid)
{
	if(!add[num]) return;
	add_tag(2*num,l,mid,add[num]);
	add_tag(2*num+1,mid+1,r,add[num]);
	add[num]=0;
}
inl void change(LL num,LL l,LL r,LL x,LL y,LL t)
{
	if(x<=l&&r<=y)
	{
		add_tag(num,l,r,t);
		return;
	}
	LL mid=(l+r)>>1;
	pushdown(num,l,r,mid);
	if(x<=mid) change(num*2,l,mid,x,y,t);
	if(mid=r) return f[num];
	LL mid=(l+r)>>1,res=0;
	pushdown(num,l,r,mid);
	if(x<=mid) res+=work(num*2,l,mid,x,y);
	if(mid

你可能感兴趣的:(模板)