int val[MAXN];
struct tree
{
int maxx,sum;
int add;
tree()
{maxx=sum=add=0;}
}use[MAXN*4];
//[ lc(x); rc(x); ]
inline int lc(int x){ return x << 1;}
inline int rc(int x){ return x << 1 | 1;}
//[ up(x); ]
inline void up(int x)
{
int l=lc(x),r=rc(x);
use[x].maxx=max(use[l].maxx,use[r].maxx);
use[x].sum=use[l].sum+use[r].sum;
}
//[ down(x); ]
//inline max_down(int x)
{
if(use[x].add!=0)
{
int l=lc(x),r=rc(x);
use[l].maxx+=use[x].add;
use[r].maxx+=use[x].add;
use[l].add+=use[x].add;
use[r].add+=use[x].add;
use[x].add=0;
}
}
//[ down(x,r-l+1); ]
inline sum_down(int x,int len)
{
//len=r-l+1
if(use[x].add!=0)
{
int l=lc(x),r=rc(x);
use[l].sum+=use[x].add*(len-(len>>1));
use[r].sum+=use[x].add*(len>>1);
use[l].add+=use[x].add;
use[r].add+=use[x].add;
use[x].add=0;
}
}
//[ build(1,1,n); ]</span>
void build(int x,int l,int r)
{
if(l==r)
{
use[x].maxx=use[x].sum=val[l];
return ;
}
int mid=(l+r)>>1;
build(lc(x),l,mid);
build(rc(x),mid+1,r);
up(x);
}
//[ updata(1,1,n,l,r,v); ]
void updata(int x,int l,int r,int op,int ed,int v)
{
if(op<=l&&r<=ed)
{
use[x].sum+=v*(r-l+1);
use[x].maxx+=v;
use[x].add+=v;
return ;
}
down(x); //根据情况选择函数和参数(max or sum)</span></span>
int mid=(l+r)>>1;
if(ed<=m)updata(lc(x),l,mid,op,ed,v);
else if(op>mid)updata(rc(x),mid+1,r,op,ed,v);
else
{
updata(lc(x),l,mid,op,ed,v);
updata(rc(x),mid+1,r,op,ed,v);
}
up(x);
}
<span style="font-size:18px;color:#FF0000;">[ query(1,1,n,l,r); ]
<span style="color:#993399;">int query(int x,int l,int r,int op,int ed)
{
if(op<=l&&r<=ed)
{
//max:
return use[x].maxx;
//sum:
return use[x].sum;
}
down(x); //根据情况选择函数和参数(max or sum)
int mid=(l+r)>>1;
if(ed<=mid)return query(lc(x),l,mid,op,ed);
else if(op>mid)return query(rc(x),mid+1,r,op,ed);
else
{
//max:
return max( query(lc(x),l,mid,op,ed) , query(rc(x),mid+1,r,op,ed) );
//sum:
return query(lc(x),l,mid,op,ed) + query(rc(x),mid+1,r,op,ed);
}
}
【模板】线段树
最新推荐文章于 2024-09-27 14:59:03 发布