autosplit(int pos){ auto it=s.lower_bound(node(pos)); if(it!=s.end()&&it->l==pos)return it; it--; int L=it->l,R=it->r; longlong V=it->v; s.erase(it); s.insert(node(L,pos-1,V)); return s.insert(node(pos,R,V)).first; }
修改
在set中删除其中所有被 $l,r$ 覆盖的区域,再新建一个新的节点,即完成。
1 2 3 4 5
voidassign(ll l,ll r,ll x){ auto itr=split(r+1),itl=split(l); s.erase(itl,itr); s.insert(node(l,r,x)); }
修改
同理,找到其中左节点和右节点,依次遍历其中的所有结点,给每一个的值都与 $x$ 进行操作。
其中有一个点需要注意,它需要遍历每个结点的 $v$ ,并把它们加上 $x$ ,如果前面结构体没有 mutable ,这里就会报一个error: cannot assign to return value because function 'operator->' returns a const value。
1 2 3 4 5 6 7 8 9 10 11 12
voidadd(ll l,ll,r,ll x){ auto itr=split(r+1),itl=split(l); for(auto it=itl;it!=itr;it++){ it->v+=x; } } voidchange(ll l,ll,r,ll x){ auto itr=split(r+1),itl=split(l); for(auto it=itl;it!=itr;it++){ it->v=x; } }