线段树模板
线段树模板
——更改值
typedef long long ll; const int maxn=1e6+10; //定义最大值 struct node{ ll l,r,sum,tag; } tree[maxn*4];//四倍空间保证不越界 ll a[maxn]; void pushdown(ll x){//将所需更改的保存在根位置的值向下推进以完成赋值 if(tree[x].tag!=-1){ tree[x<<1].sum=max(tree[x].tag,tree[x<<1].sum); tree[x<<1|1].sum=max(tree[x].tag,tree[x<<1|1].sum); tree[x<<1].tag=max(tree[x<<1].tag,tree[x].tag); tree[x<<1|1].tag=max(tree[x<<1|1].tag,tree[x].tag); tree[x].tag=-1; } } void change(ll p,ll l,ll r,ll x){//更改特定点的值 if(tree[p].l==tree[p].r){ tree[p].sum=x; return; } pushdown(p); ll mid=(tree[p].l+tree[p].r)>>1; if(mid>=l) change(p<<1,l,r,x); if(mid<r) change(p<<1|1,l,r,x); return; } void change_all(ll p,ll l,ll r,ll x){//给在根位置记录所需更改的最大值 tree[1].tag=max(tree[1].tag,x); tree[1].sum=max(tree[1].sum,tree[1].tag); return; } void build(ll p,ll l,ll r){//构建线段树 tree[p].l=l; tree[p].r=r; tree[p].sum=tree[p].tag=-1; if(l==r){ tree[p].sum=a[l]; return; } ll mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); } ll query(ll p,ll l,ll r){//查询从p(一般为1)层开始的[l,r]内的值 if(tree[p].l==tree[p].r){ return tree[p].sum; } pushdown(p); ll mid=(tree[p].l+tree[p].r)>>1; if(l<=mid) return query(p<<1,l,r); if(r>mid) return query(p<<1|1,l,r); }

浙公网安备 33010602011771号