随意地取 B=n^{0.4}。然后当子树大小 \le B 时采用旋转扫描线预处理。那么现在询问的时间复杂度被降低到了 \tilde O(n^{0.474}),而预处理旋转扫描线的复杂度也仅仅是 \tilde O(n^{1.4}),所以总的复杂度是 O(n^{1.5})。
最后一个问题:如何建树?
我们先选择一条平分点集的直线,比如 x 的中位数,将直线左侧的点称为红点,右边的称为蓝点。考虑一个半平面 P,钦定这个半平面中包含了一半的红点。那么如果确定 P 的角度 \theta,那么 P 其实就被确定了。\theta=0 和 \theta=\pi 这两种情况 P 中分别包含了 t 个和 n-t 个蓝点。根据介值定理,必然能找到一个 \theta 使得 P 包含了一半的蓝点。于是直接二分,取包含 n/2 的区间即可。
对于一般情形,只需要取 \sqrt m 个关键点,B\approx m^{0.56} 就能做到大约 O(n\sqrt m+m^{0.56}n^{0.88}) 的复杂度,还是比较遗憾的。因为我们知道二维莫队可以规约到半平面莫队,只要将点排成 L 字形。