靜態數組,多次查詢區間第 k 小。n, m ≤ 10⁵,數值範圍大,需離線結構。
類似快速排序分治:每層將區間數值按中位數分為左右兩組,保持相對順序,記錄每個位置分到左邊的個數(toleft[dep][i])。查詢時根據左側個數決定遞歸左或右子區間。
build(l, r, dep)sorted[mid] 為當前區間中位數。same = 左半區間長度 - 已分入左側的「小於中位數」個數,用於處理等於中位數的元素分配。tree[dep][i] < sorted[mid] 或 == 且 same>0 分入左邊(tree[dep+1][lpos++]),否則右邊。同時構建 toleft[dep][i] = toleft[dep][l-1] + (lpos - l)。query(L, R, l, r, dep, k)tree[dep][l]。toleft[dep][r] - toleft[dep][l-1] 為查詢區間落入左側的個數。newl = L + toleft[dep][l-1] - toleft[dep][L-1],newr = newl + cnt - 1。構建 O(n log n),查詢 O(log n),空間 O(n log n)。適合靜態區間第 k 小,代碼常數較小。