一道比较基础的裸得一丝不挂RMQ,甚至都没涉及到修改某一区间值的问题…… RMQ应该还可以用ST算法,或者转化为LCA,会很快很快,但是呢,可惜我都不会……用时1.5s还多…但我觉得对于NOIP会这个程度的RMQ就应该足够了吧! program balanced_lineup; type rec=record l,r,max,min:longint; end; var a:array[0..300000] of rec; data:array[0..50000] of longint; i,n,m,s,t,ma,mb:longint; function getmax(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; function getmin(a,b:longint):longint; begin if a<b then exit(a) else exit(b); end; procedure buildtree(i,st,en:longint); var mid,j:longint; begin a[i].l:=st; a[i].r:=en; if st=en then begin a[i].max:=data[st]; a[i].min:=data[st]; exit; end; mid:=(st+en) shr 1; j:=i shl 1; buildtree(j,st,mid); buildtree(j+1,mid+1,en); a[i].max:=getmax(a[j].max,a[j+1].max); a[i].min:=getmin(a[j].min,a[j+1].min); end; function findmax(i,st,en:longint):longint; var mid,j,ta,tb:longint; begin if (a[i].l=st) and (a[i].r=en) then exit(a[i].max); mid:=(a[i].l+a[i].r) shr 1; j:=i shl 1; if mid>=en then exit(findmax(j,st,en)) else if mid<st then exit(findmax(j+1,st,en)) else begin ta:=findmax(j,st,mid); tb:=findmax(j+1,mid+1,en); exit(getmax(ta,tb)); end; end; function findmin(i,st,en:longint):longint; var mid,j,ta,tb:longint; begin if (a[i].l=st) and (a[i].r=en) then exit(a[i].min); mid:=(a[i].l+a[i].r) shr 1; j:=i shl 1; if mid>=en then exit(findmin(j,st,en)) else if mid<st then exit(findmin(j+1,st,en)) else begin ta:=findmin(j,st,mid); tb:=findmin(j+1,mid+1,en); exit(getmin(ta,tb)); end; end; begin assign(input,'a.in'); reset(input); assign(output,'a.out'); rewrite(output); readln(n,m); for i:=1 to n do readln(data[i]); buildtree(1,1,n); for i:=1 to m do begin readln(s,t); ma:=findmax(1,s,t); mb:=findmin(1,s,t); writeln(ma-mb); end; close(input); close(output); end.