注意 split 顺序和 iterator 的时效问题。
比如比较烦的 swap 操作(交换两段),你应该这么写:
void swp(ll l1,ll r1,ll l2,ll r2)
{
g1.clear();g2.clear();
if(l1>l2)swap(l1,l2),swap(r1,r2);
si itr1=split(r1+1),itl1=split(l1);
for(si it=itl1;it!=itr1;it++)g1.push_back(node(it->l,it->r,it->val));
s.erase(itl1,itr1);
si itr2=split(r2+1),itl2=split(l2);
for(si it=itl2;it!=itr2;it++)g2.push_back(node(it->l,it->r,it->val));
s.erase(itl2,itr2);
for(node t:g2)s.insert(node(l1+t.l-l2,l1+t.r-l2,t.val));
for(node t:g1)s.insert(node(l2+t.l-l1,l2+t.r-l1,t.val));
}
4 就一定不能在 2 之前写,会导致你原先的 iterator 出现问题,从而找不到正确的地址。
其他设计多个区间的操作也是同理。
(都是血与泪的教训啊……)