program didele_valstybe;
  { 141 u‘davinys }
  uses terrainc;
  const TIKSLUMAS = 0.000001; { žiuo tikslumu iežkome tažko, kuriame }
                                { spindulys kerta valstyb‚s sien… }
        SKAIT = 5; { tiek skaitmen— tikslumu reikia rasti plot… }

  function ilgis (a, b: real): real;
  { randa sta‡iojo trikampio ‘ambin‚s ilg, kai duoti jos statiniai }
  { m–s— atveju tai bus iežkomas atkarpos ilgis }
  begin
    ilgis := sqrt(a * a + b * b);
  end; { ilgis }

  procedure galas (alfa, cx, cy: real; n: integer; { kvadrato kražtin‚ }
                   var gx, gy: real);
  { randame atkarpos gal… - tažk…, kuriame spindulys ižvestas iž kvadrato }
  { centro (cx, cy) kampu alfa kerta kvadrato kražtinŠ }
    var sinus, cosin, pi_4: real;
  begin
    sinus := sin (alfa);
    cosin := cos (alfa);
    pi_4 := 1 / sqrt(2); { sin(45) = cos (45), kampas matuojamas laipsniais }
    if cosin <= -pi_4 { iežkomas tažkas yra kairiojoje kvadrato kražtin‚je }
       then begin
              gx := cx - n/2;
              gy := cy - n/2 * sinus/cosin
            end
    else if cosin >= pi_4  { tažkas dežiniojoje kražtin‚je }
            then begin
                   gx:= cx + n/2;
                   gy := cy + n/2 * sinus/cosin
                 end
    else if sinus <= - pi_4 { tažkas apatin‚je kražtin‚je }
            then begin
                   gy := cy - n/2;
                   gx := cx - n/2 * cosin/sinus
                 end
    else begin  { tažkas viržutin‚je kražtin‚je }
           gy := cy + n/2;
           gx := cx + n/2 * cosin/sinus
         end
  end; { galas }

  procedure krastas (alfa, epsilon, cx, cy: real;
                     n: integer; { kvadrato kražtin‚ }
                     var x, y: real);
  { randa tažk…, kuriame spindulys ižvestas iž kvadrato centro (cx, xy) }
  { kampu alfa kerta daugiakamp }
    var gx, gy, vx, vy: real;
  begin
    { spindulio prad‘ia bus kvadrao centre; ji priklauso valstybei }
    x := cx;  y := cy;
    { randame atkarpos gal… - tažk…, kuriame spindulys kerta }
    { kvadrato kražtinŠ }
    galas (alfa, cx, cy, n, gx, gy);
    if valstybe (gx, gy)
      then begin { jei atkarpos galas priklauso valstybei }
             x := gx; y := gy;
           end
      else repeat  { priežingu atveju iežkome reikiamo tažko }
             { randame atkarpos vidurio tažk… }
             vx := (x + gx)/2;
             vy := (y + gy)/2;
             if valstybe (vx, vy)
                then begin { jei vidurio tažkas priklauso valstybei }
                      x := vx; y := vy;
                     end
                else begin { jei nepriklauso }
                       gx := vx;
                       gy := vy;
                     end
           until ilgis (gx - x, gy - y) < epsilon;
  end; { kražtas }

  function sutampa (senas, naujas: real; ska: integer): boolean;
  { patikrina, ar sutampa duot— skai‡i— pirmieji ska skaitmen— }
  { 0 <= senas <= naujas }
    var i, daug, laipsn: longint;
  begin
    { randa 10 laipsn, iž kurio padalinus naujas reikžm‚ taps }
    { ma‘esn‚ u‘ vienet… }
    daug := 1;
    while naujas > daug do
      daug := daug * 10;
    laipsn := 1;
    for i := 1 to ska do
      laipsn := laipsn * 10;
    { skai‡ius pertvarkome taip, kad skai‡iaus naujas sveik…j… dal }
    { sudaryt— ska skaitmen— }
    naujas := naujas / daug * laipsn;
    senas := senas / daug * laipsn;
   sutampa := round(senas) = round(naujas)
  end; { sutampa }

  function plotas (kvadx, kvady, n: integer): real;
  { randa valstyb‚s plot… }
    var senas, p, cx, cy, alfa, ilg2, ilg1, min, x, y: real;
        i, kiek: integer;
  begin
    p := 0; { kol kas plotas lygus 0 }
    { randame kvadrato vidurio tažk… }
    cx := kvadx + n/2;
    cy := kvady + n/2;
    { randame padalijim— skai‡i— }
    kiek := 1440;
    repeat
      senas := p; p := 0;
      min := 2 * PI / kiek;
      alfa := 0;
      { randa tažk…, kuriame spindulys ižvestas iž kvadrato centro }
      { kampu alfa kerta daugiakamp }
      krastas (alfa, TIKSLUMAS, cx, cy, n, x, y);
      { rasime atkarpos, ižvestos iž kvadrato centro  tažk… (x, y) ilg }
      ilg2 := ilgis (x - cx, y - cy);
      for i := 1 to kiek do
        begin
          ilg1 := ilg2;
          { padidiname kamp… }
          alfa := i * min;
          { randame antr…j… atkarp… }
          krastas (alfa, TIKSLUMAS, cx, cy, n, x, y);
          ilg2 := ilgis (x - cx, y - cy);
          p := p + ilg1 * ilg2;
        end;
      p := p * 1/2 * sin(min); { daugyba buvo ižkelta priež skliaustus }
      kiek := kiek * 2;
    until sutampa (senas, p, SKAIT);
    plotas := p;
  end; { plotas }

  procedure spausdinti (sk: real; tiksl: integer);
  { atspausdina plot… (<= maxlongint) nurodytu tikslumu }
    var kiek, po, i, skaicius: longint;
        tarp: real;
  begin
    { suskai‡iuojame kiek skaitmen— sudaro sveikoji dalis }
    kiek := 1; { priež kablel visuomet ražomas bent nulis }
    tarp := sk;
    while tarp > 10 do
      begin
        tarp := tarp / 10;
        kiek := kiek + 1;
      end;
   po := tiksl - kiek; { tiek skaitmen— reikia atspausdinti po kablelio }
   if po = 0 { sveikoji dalis turi tiksl skaitmen— }
   then writeln (round(sk))
   else if po > 0
        then  writeln (sk: 1: po)
        else begin  { reikia apvalinti sveik…j… dal }
               for i := 1 to kiek do
                 sk := sk/10;
               skaicius := round(sk);
               for i := 1 to kiek do
                 skaicius := skaicius * 10;
               writeln (skaicius);
             end;
  end; { spausdinti }

  var kvadx, kvady, n: integer;
begin
  dydis (kvadx, kvady, n);
  spausdinti (plotas(kvadx, kvady, n), SKAIT);
end.
