社員同士の上司-部下の関係をグラフに表してみましょう。
すると、それはwarabi君を根とした木(頂点の番号に社員の番号が対応)であることがわかります。
その時、「(l,l+1...r)(l,l+1...r)全員に指示が出せる社員」という条件は「(l,l+1...r)(l,l+1...r)どの頂点からも、親方向にたどっていってたどり着ける頂点」
と言い換えられます。
この「親をたどってたどり着ける頂点」のことを共通祖先と呼びます。
共通祖先を求めるのには、LCAというアルゴリズムが有効で、O(logN)O(log N)で求めることができます。
しかし、これは任意の二頂点に限ったことなので、結局クエリの区間分の計算量がかかってしまい、全体の計算量はO(QNlogN)O(QNlogN)になってしまいます。
これを高速化するのに、segment-treeを使い、二つのノードの親をその共通祖先...と
することで、前処理にO(Nlog2N)O(N log^2 N)、区間クエリにO(log2N)O(log^2 N)で答えることができます。これは十分に高速です。