is obviously a rmq problem, multiply the method, maintain the area of the maximum/small value on the line.
1 varN,i,j,q,f,t,times:longint;2hmin,hmax:array[0.. -,0..50000] of Longint;3 function min (a,b:longint): Longint;4 begin5 ifA>B then exit (b)6 Elseexit (a);7 end;8 function Max (a,b:longint): Longint;9 beginTen ifA>B then exit (a) One Elseexit (b); A end; - begin - readln (n,q); the fori:=1to n Do - begin -READLN (hmax[0, I]); -hmin[0, i]:=hmax[0, I]; + end; - fori:=1to Trunc (ln (n)/ln (2))+1 Do + forj:=1To N (1SHL i) +1 Do A begin atHmin[i,j]:=min (hmin[i-1, j],hmin[i-1, j+ (1SHL (i1))]); -Hmax[i,j]:=max (hmax[i-1, j],hmax[i-1, j+ (1SHL (i1))]); - end; - fori:=1to Q Do - begin - readln (f,t); inTimes:=trunc (LN (t-f+1)/LN (2)); -Writeln (Max (hmax[times,f],hmax[times,t-(1SHL times) +1])- toMin (hmin[times,f],hmin[times,t-(1SHL times) +1])); + end; -End.
P1699: [Usaco2007 jan]balanced lineup queue