1278. 排队 (Standard IO)

来源:互联网 发布:算法导论英文版 pdf 编辑:程序博客网 时间:2024/06/03 06:08

Description

每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛.但是为了避免水平悬殊,牛的身高不应该相差太大.John 准备了Q (1 <= Q <= 180,000) 个可能的牛的选择和所有牛的身高 (1 <=身高 <= 1,000,000). 他想知道每一组里面最高和最低的牛的身高差别.

Input

第一行: N 和 Q.第2..N+1行: 第i+1行是第i头牛的身高.第N+2..N+Q+1行: 两个整数, A 和 B (1 <= A <= B <= N), 表示从A到B的所有牛.

Output

第1..Q行: 所有询问的回答 (最高和最低的牛的身高差), 每行一个.

Sample Input

6 31734251 54 62 2

Sample Output

630

思路

O(logn)线段树,记录每个区间内最大和最小的值。
var  a:array[1..200000] of longint;  f:array[1..200000,1..2] of longint;  min,max,x:longint;procedure js(l,r,i:longint);var  mid:longint;begin  mid:=(l+r) div 2;  if l=r then    begin      inc(x);      f[i,1]:=a[x];      f[i,2]:=a[x];    end  else    begin      js(l,mid,i*2);      js(mid+1,r,i*2+1);      f[i,1]:=f[i*2,1];      if f[i*2+1,1]<f[i,1] then f[i,1]:=f[i*2+1,1];      f[i,2]:=f[i*2,2];      if f[i*2+1,2]>f[i,2] then f[i,2]:=f[i*2+1,2];    end;end;procedure z(l,r,p,q,i:longint);var  mid:longint;begin  mid:=(l+r) div 2;  if (l=p) and (r=q) then    begin      if f[i,1]<min then min:=f[i,1];      if f[i,2]>max then max:=f[i,2];      exit;    end;  if q<=mid then z(l,mid,p,q,i*2)    else      if p>mid then z(mid+1,r,p,q,i*2+1)        else          begin            z(l,mid,p,mid,i*2);            z(mid+1,r,mid+1,q,i*2+1);          end;end;var  i,j,n,m,p,q:longint;begin  readln(n,m);  for i:=1 to n do    readln(a[i]);  js(1,n,1);  for i:=1 to m do    begin      readln(p,q);      min:=maxlongint;      max:=0;      z(1,n,p,q,1);      writeln(max-min);    end;end.
原创粉丝点击