program O_VALCOCLOVEKOVI_II; const MaxStlpy = 100; var M, N, P, I : Word; D, R : Real; Stlpy : array[1..MaxStlpy, 1..2]of Real; Bol : array[0..MaxStlpy + 1]of Boolean; procedure Nacitaj; begin ReadLn(M, N, R, P); D := 2 * R; for I := 1 to P do begin ReadLn(Stlpy[I, 1], Stlpy[I, 2]); Bol[I] := False; end; Bol[P + 1] := False; end; function Vzd2(S1, S2: Word): Real; begin if S1 = 0 then if S2 = 0 then Vzd2 := 0 else if S2 = P + 1 then Vzd2 := N * N else Vzd2 := Stlpy[S2, 2] * Stlpy[S2, 2] else if S1 = P + 1 then if S2 = 0 then Vzd2 := N * N else if S2 = P + 1 then Vzd2 := 0 else Vzd2 := (N - Stlpy[S2, 2]) * (N - Stlpy[S2, 2]) else if S2 = 0 then Vzd2 := Stlpy[S1, 2] * Stlpy[S1, 2] else if S2 = P + 1 then Vzd2 := (N - Stlpy[S1, 2]) * (N - Stlpy[S1, 2]) else Vzd2 := Sqr(Stlpy[S1, 2] - Stlpy[S2, 2]) + Sqr(Stlpy[S1, 1] - Stlpy[S2, 1]); end; function Prejdi: Boolean; var Stlp, ZasV : Word; Zas : array[1..MaxStlpy]of Word; begin Zas[1] := 0; ZasV := 1; Bol[0] := True; repeat Stlp := Zas[ZasV]; Dec(ZasV); for I := 1 to P + 1 do if not(Bol[I]) and (Vzd2(Stlp, I) < D * D) then begin Inc(ZasV); Zas[ZasV] := I; Bol[I] := True; end; { Vyber zo zasobnika vrchol a skontroluj vsetky neprekontrolovane stlpy, ktore su k nemu blizsie ako 2 * R - pridaj ich do zasobnika } until (ZasV = 0) or Bol[P + 1]; Prejdi := Bol[P + 1]; end; begin Nacitaj; if (N < D) or Prejdi then { sirka valcocloveka II je vacsia ako pivnica alebo sa da prejst od sveru k juhu po blizkych stlpoch } WriteLn('Valcoclovek II neprejde pivnicou.') else WriteLn('Valcoclovek II prejde pivnicou.'); end.