// Rmq, calculate the difference between the maximum and minimum values of a given interval <br/> # include <iostream> <br/> # include <cmath> <br/> using namespace STD; <br/> int n, m, K, St, Ed; <br/> int Max, min; <br/> int _ MAX [50010] [17]; <br/> int _ Min [1, 50010] [17]; <br/> void rmq_init () // rmq initialization template <br/>{< br/> for (Int J = 1; (1 <j) <= N; ++ J) <br/> {<br/> for (INT I = 1; I + (1 <j)-1 <= N; ++ I) <br/> {<br/> _ MAX [I] [J] = max (_ MAX [I] [J-1], _ MAX [I + (1 <(J-1)] [J-1]); <br/> _ Min [I] [J] = min (_ Min [I] [J-1], _ Min [I + (1 <(J-1)] [J-1]); <br/>}< br/> int rmq (INT St, int ed) // rmq query <br/>{< br/> K = (INT) (log (double) (ED-ST + 1)/log (2.0 )); <br/> max = max (_ MAX [st] [K], _ MAX [ed-(1 <k) + 1] [k]); <br/> min = min (_ Min [st] [K], _ Min [ed-(1 <k) + 1] [k]); <br/> return max-min; <br/>}< br/> int main () <br/>{< br/> // freopen ("in.txt ", "r", stdin); <br/> scanf ("% d", & N, & M); <br/> for (INT I = 1; I <= N; ++ I) <br/> {<br/> scanf ("% d", & _ MAX [I] [0]); <br/> _ Min [I] [0] = _ MAX [I] [0]; <br/>}< br/> rmq_init (); <br/> for (INT I = 1; I <= m; ++ I) <br/> {<br/> scanf ("% d ", & St, & ED); <br/> printf ("% d/N", rmq (St, Ed); <br/>}< br/> return 0; <br/>}