区间合并建线段树用结构体方便,build时不需要pushup(小特点~),而且结构体内置函数省下好多代码量,(据说是某巨佬HH的风格)。最重要的一点,pushup时当左/右子节点全部长度可用时(说明和另一方相连了),需要更新父节点的llen和rrlen。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 5e4 + 10;
struct Tree
{
int l, r;
int len;
int llen, rlen;
int mark;
int mid()
{
return l + r >> 1;
}
int cal_len()
{
return r - l + 1;
}
void update_len()
{
len = llen = rlen = (mark ? 0 : cal_len());
}
}tree[maxn << 2];
int n, m;
void build(int rt, int l, int r)
{
tree[rt].l = l, tree[rt].r = r;
tree[rt].mark = 0; //t