众所周知,线段树是一种极其好的数据结构,对于维护区间各种操作都有良好的性能,但是我们并不满足,因为普通线段树是通过递归实现的,所以就会有一些问题,例如常数大和栈空间占用大。
因此,我们就想能不能有一种非递归版的线段树,于是zkw天牛创造了一种名为zkw线段树的非递归版线段树,详见《统计的力量》
1、建树

我们可以先观察左边面这张图。这张图本来是一张堆式的树形图,这里把它转化成了二进制。从中,我们可以发现最底层的节点舍去最低位,也就是说向右移一位之后,就变成了他们的父节点。同理,第二层中的结点也可以通过相同的方式变成根节点。
因此,我们在构建这棵树时,就可以利用计算机的二进制建树,达到快速简单的目的。
(不知道大家有没有听说过一句话,写程序要保持短而简单——Keep it short and simple,KISS)。
void build(int n)
{
for(bit=1;bit<=n+1;bit<<=1); //bit为所能到达的最深层层数
for(int i=bit+1;i<=bit+n;i++)
scanf("%d",&d[i]);
for(int i=bit-1;i;i--)
d[i]=max(d[i<<1],d[i<<1|1]);
//i<<1|1 = (i<<1)+1 = 2*i+1
}