Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {$APPTYPE CONSOLE}
- {$R+,S+,Q+,I+,C+,M+,H+,O+}
- {R+,S-,Q+,I-,C-,M-,H-,O+}
- uses
- SysUtils, Math;
- var
- i, qq : longint;
- n, q, s, f, ls, lf : int64;
- x, y : array[0..100010] of extended;
- d, dd : array[0..100010] of extended;
- p : array[0..100010, 1..2] of extended;
- ans, ys, yf : extended;
- function dst(y1, y2 : extended) : extended;
- begin
- result := max(y2 - y1, 0);
- end;
- function find(xx : int64) : int64;
- var
- l, r, c : int64;
- begin
- l := 1;
- r := n;
- while r - l > 1 do begin
- c := (l + r) shr 1;
- if x[c] > xx then r := c else l := c;
- end;
- if x[r] <= xx then result := r else result := l;
- end;
- function getY(l : int64; x : extended) : extended;
- begin
- if l > n then result := y[n] else result := p[l][1] * x + p[l][2];
- end;
- begin
- reset(input, 'input.txt');
- rewrite(output, 'output.txt');
- read(n);
- for i := 1 to n do
- read(x[i], y[i]);
- x[n + 1] := x[n] + 10;
- y[n + 1] := y[n] + 10;
- d[1] := 0;
- for i := 2 to n do begin
- d[i] := d[i - 1] + dst(y[i - 1], y[i]);
- p[i][1] := (y[i] - y[i - 1]) / (x[i] - x[i - 1]);
- p[i][2] := (y[i - 1] * x[i] - x[i - 1] * y[i]) / (x[i] - x[i - 1]);
- end;
- dd[n] := 0;
- for i := n - 1 downto 1 do
- dd[i] := dd[i + 1] + dst(y[i + 1], y[i]);
- read(q);
- for qq := 1 to q do begin
- read(s, f);
- ls := find(s);
- lf := find(f);
- ys := getY(ls + 1, s);
- yf := getY(lf + 1, f);
- if s = f then ans := 0 else
- if s < f then
- if ls = lf then ans := dst(ys, yf) else ans := d[lf] - d[ls + 1] + dst(ys, y[ls + 1]) + dst(y[lf], yf)
- else
- if ls = lf then ans := dst(ys, yf) else ans := dd[lf + 1] - dd[ls] + dst(ys, y[ls]) + dst(y[lf + 1], yf);
- writeln(ans:0:16);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement