题目大意是:
给你n个房子,然后有m个操作:
(1):D x:代表摧毁第x个村庄
(2):Q x:查询与第x个村庄直接或间接(即为通过其他没有被炸毁的村庄相连接的)的村子的个数
(3):R :代表的是最后被摧毁的那个村庄被修复(这里就要用到栈了,哈哈)
唔。。。这道线段树的题目想了很久也没啥思路,网上说和poj hotel的那题很像,但是一直联系不起来,但是想通了也就这样吧。
其实线段树是一个很灵活的东西,它是辅助功能,这里它的作用是为了query(查询操作)与update(更新操作)。
当然其中还有一个lazy-tag的思想,那就是向上更新的时候,这个是经典的区间合并的操作,(其实我觉得叫这名字有点怪怪的感觉。。。
void pushup(int v){
int temp=v<<1;
tree[v].ls=tree[temp].ls;
tree[v].rs=tree[temp+1].rs;
if(tree[v].ls==tree[temp].r-tree[temp].l+1) tree[v].ls+=tree[temp+1].ls;
if(tree[v].rs==tree[temp+1].r-tree[temp+1].l+1) tree[v].rs+=tree[temp].rs;
tree[v].ms=max(tree[temp].rs&