#define MAXN 100
struct Node
{
int l,r,mx;
}tr[MAXN<<2];
void build(int d,int l,int r)
{
tr[d].l=l,tr[d].r=r;
if(l==r)
{
tr[d].mx=b[l];
return;
}
int mid=(l+r)/2,lc=d*2,rc=d*2+1;
build(lc,l,mid);
build(rc,mid+1,r);
tr[d].mx=max(tr[lc].mx,tr[rc].mx);
}
int query(int d,int l,int r) //[l,r]表示询问区间
{
if(tr[d].l==tr[d].r)
return tr[d].mx;
int mid=(tr[d].l+tr[d].r)/2,lc=d*2,rc=d*2+1;
if(r<=mid) return query(lc,l,mid); // 询问区间的右边界 r <= mid 即询问区间在左儿子
else if(l>mid) return query(rc,mid+1,r);
else return max(query(lc,l,mid),query(re,mid+1,r)); // 询问区间此处在左儿子和右儿子中各有一部分的情况
}
void modify(int d,int pos,int v) // 将位置为pos的元素改为v
{
if(tr[d].l==tr[d].r&&tr[d].l==pos)
{
tr[d].mx=v;
return;
}
int mid=(tr[d].l+tr[d].r)/2,lc=d*2,rc=d*2+1;
if(pos<=mid) modify(lc,pos,v);
else modify(rc,pos,v);
tr[d].mx=max(tr[lc].mx,lr[rc].mx);
}
线段树模板
最新推荐文章于 2024-03-01 00:18:20 发布