const maxn=50001;
      maxm=trunc(ln(maxn)/ln(2));
var   f,g:array[0..maxn,0..maxm] of longint;
      num:array[0..maxn] of longint;
      n,m,i,j,maxnum,minnum,l,r,k:longint;

      function max(a,b:longint):longint;
      begin if a>b then exit(a); exit(b); end;

      function min(a,b:longint):longint;
      begin if a<b then exit(a); exit(b); end;

      function lg(x:longint):longint;
      begin exit(trunc(ln(x)/ln(2))); end;

      function ex(x:longint):longint;
      begin exit(1<<x); end;

begin
      readln(n,m);
      for i:=1 to n do
      begin
            readln(num[i]);
            f[i,0]:=num[i];
            g[i,0]:=num[i];
      end;
      for j:=1 to lg(n) do
         for i:=1 to n-ex(j)+1 do
         f[i,j]:=min(f[i,j-1],f[i+ex(j-1),j-1]);

      for j:=1 to lg(n) do
         for i:=1 to n-ex(j)+1 do
         g[i,j]:=max(g[i,j-1],g[i+ex(j-1),j-1]);

      for i:=1 to m do
      begin
            readln(l,r);
            k:=lg(r-l+1);
            minnum:=min(f[l,k],f[r-ex(k)+1,k]);
            maxnum:=max(g[l,k],g[r-ex(k)+1,k]);
            writeln(maxnum-minnum);
      end;
end.

  

分类:

技术点:

相关文章: