/*
Нак░а▓ко пе░и┤░ази░ано │▒ловие
В п░аво║г║лна коо░дина▓на ▒и▒▓ема (N*N кле▓ки, N<=10000) ▒а ░азположени две
п░║╖ки (RODS), една ╡о░изон▓ална и една ве░▓икална, в▒┐ка ▒ д║лжина поне две
квад░а▓╖е▓а и дебелина 1 квад░а▓╖е. Две▓е п░║╖ки може и да ▒е за▒▓║пва▓.
Дадена е библио▓е╖на ┤│нк╢и┐, ко┐▓о п░ове░┐ва дали даден п░аво║г║лен │╖а▒▓║к
за▒▓║пва ╖а▒▓ или ╢┐ла п░║╖ка. Т░┐бва ▒ най-много 100 повиквани┐ на ┤│нк╢и┐▓а
да ▒е оп░едели ме▒▓оположение▓о и д║лжина▓а на две▓е п░║╖ки.

.......
.......
.....#.
.....#.
.###.#.
.....#.
.....#.
.......

К░а▓ко опи▒ание на ░е╕ение▓о
Ре╕аваме ка▓о изв║░╕им 6 двои╖ни ▓║░▒ени┐. За в▒┐ко едно о▓ ▓┐╡ изв║░╕ваме
мак▒им│м 15 (lg 10000) опе░а╢ии. Б░о┐ на п░ове░ки▓е в най-ло╕и┐ ▒л│╖ай до▒▓ига
lg 10000 + 5 (за дадени▓е ▓е▒▓ове ▓ова до▒▓ига 90 п░ове░ки).

П║░ви▓е 4 двои╖ни ▓║░▒ени┐ изв║░╕ваме за да ог░ани╖им п░║╖ки▓е о▓го░е, о▓дол│,
о▓л┐во и о▓д┐▒но. След ▓ова п░ове░┐ваме ╖е▓и░и▓е ║глови квад░а▓╖е▓а. В
зави▒имо▒▓ о▓ о▓гово░а на ┤│нк╢и┐▓а имаме 10 в║зможни ▒л│╖а┐, кои▓о ▒а опи▒ани
в ▒о░▒ кода. Две▓е ┤│нк╢ии, ▒ кои▓о изв║░╕ваме двои╖но▓о ▓║░▒ене нами░а▓ в
даден ин▓е░вал к║де е ▒║о▓ве▓но най-го░ни┐ (леви┐) и най-долни┐ (де▒ни┐) к░ай
на п░║╖ка.

findend(ffr,fto,c1,c2,h)

ffr и fto - на╖ало и к░ай
c1 и c2 - д░│ги▓е две коо░дина▓и
h : 0-двои╖но▓о ▓║░▒ене ▒е изв║░╕ва ╡о░изон▓ално
    1-двои╖но▓о ▓║░▒ене ▒е изв║░╕ва ве░▓икално

Ве▒елин Рай╖ев
*/

// TO compile, add to linker options crectlib.o

#include <stdio.h>
#include "crectlib.h"

int check1(int x1,int y1,int x2,int y2)
{
  int r;
//  printf("c %d %d %d %d",x1+1,y1+1,x2,y2);
  r=rect(y1+1,y2,x1+1,x2);
//  printf(" = %d\n",r);
  return r?1:0;
}

int check(int ffr,int fto,int c1,int c2,int h)
{
  if (fto==ffr) { return 0; }

  if (h) { return check1(c1,ffr,c2,fto); }
  return check1(ffr,c1,fto,c2);
}

int findbeg(int ffr,int fto,int c1,int c2,int h)
{
  if (fto-ffr<=1)
  {
    if (check(ffr,fto,c1,c2,h)) { return ffr; }
    return fto;
  }
  {
    int m;
    m=(fto+ffr)/2;
    if (check(ffr,m,c1,c2,h)) { return findbeg(ffr,m,c1,c2,h); }
    return findbeg(m,fto,c1,c2,h);
//    if (check(m,fto,c1,c2,h)) { return findbeg(ffr,m,c1,c2,h); }
//    return findbeg(m,fto,c1,c2,h);
  }
}

int findend(int ffr,int fto,int c1,int c2,int h)
{
  if (fto-ffr<=1)
  {
    if (check(ffr,fto,c1,c2,h)) { return fto; }
    return ffr;
  }
  {
    int m;
    m=(ffr+fto)/2;
    if (check(m,fto,c1,c2,h)) { return findend(m,fto,c1,c2,h); }
    return findend(ffr,m,c1,c2,h);
  }
}

int decif(int a,int b)
{
  if (a==b) { return a-1; }
  return a;
}

int incif(int a,int b)
{
  if (a==b) { return a+1; }
  return a;
}

int rep(int hory,int horf,int hort,
        int verx,int verf,int vert)
{
  report(hory+1,horf+1,hory+1,hort,
         verf+1,verx+1,vert,verx+1);
  return 0;
}

int main(void)
{
  int x1,y1,x2,y2,n;
  
//  int hor,horf,hort;
//  int ver,verf,vert;

  n = gridsize();

  y1 = findbeg(0,n,0,n,1);  // === ffr,fto are in y
  y2 = findend(y1+2,n,0,n,1);

  x1 = findbeg(0,n,0,n,0);  // === ffr,fto are in x
  x2 = findend(x1+2,n,0,n,0);

//  printf("%d %d %d %d\n",x1,y1,x2,y2);

  switch (
    (check1(x1,y1,x1+1,y1+1)<<3) +
    (check1(x2-1,y1,x2,y1+1)<<2) +
    (check1(x1,y2-1,x1+1,y2)<<1) +
    (check1(x2-1,y2-1,x2,y2)   )  )
  {
    case 0: // + shape
            rep( findbeg(y1,y2,x1,x1+1,1) , x1,x2,
                 findbeg(x1,x2,y1,y1+1,0) , y1,y2); break;
    case 1:
    case 2: break; // impossible
    case 3: // _|_ shape
            rep( y2-1 , x1,x2 ,
                 findbeg(x1,x2,y1,y1+1,0) , y1,
                  incif( findend(y1,y2-1,x1,x2,1), y2-1)); break;
    case 4: break; // impossible
    case 5: // -| shape
            rep( findbeg(y1,y2,x1,x1+1,1) , x1,
                  incif( findend(x1,x2-1,y1,y2,0), x2-1),
                 x2-1 , y1,y2 ); break;
    case 6: if (check1(x2-2,y1,x2-1,y1+1))
            { // | ^
              rep( y1, findbeg(x1,x2,y1,y1+1,0) , x2 ,
                   x1, findbeg(y1,y2,x1,x1+1,1) , y2 );
            } else {
              rep( y2-1, x1, findend(x1,x2,y2-1,y2,0) ,
                   x2-1, y1, findend(y1,y2,x2-1,x2,1) );
            } break;
    case 7: // _| shape
              rep( y2-1, x1, incif(findend(x1,x2-1,y2-1,y2,0) , x2-1) ,
                   x2-1, y1, incif(findend(y1,y2-1,x2-1,x2,1) , y2-1) ); break;
    case 8: break; // impossible;
    case 9: if (check1(x1+1,y1,x1+2,y1+1))
            {
              rep( y1 , x1 , findend(x1,x2,y1,y1+1,0) ,
                   x2-1 , findbeg(y1,y2,x2-1,x2,1) , y2 );
            } else {
              rep( y2-1, findbeg(x1,x2,y2-1,y2,0) , x2 ,
                   x1 , y1 , findend(y1,y2,x1,x1+1,1) );
            } break;
   case 10: // |- shape
            rep( findbeg(y1,y2,x2-1,x2,1) ,
                  findbeg(x1+1,x2,y1,y2,0) , x2 ,
                 x1,y1,y2 ); break;
   case 11: // |_ shape
            rep( y2-1, decif( findbeg(x1+1,x2,y2-1,y2,0) , x1+1 ), x2 ,
                 x1, y1, incif( findend(y1,y2-1,x1,x1+1,1) ,y2-1) ); break;
   case 12: // ^|^ shape
            rep( y1,x1,x2,
                 findbeg(x1,x2,y2-1,y2,0) ,
                  decif( findbeg(y1+1,y2,x1,x2,1) , y1+1) , y2 ); break;
   case 13: // ^| shape
            rep( y1,x1, incif( findend(x1,x2-1,y1,y1+1,0) , x2-1 ),
                 x2-1, decif( findbeg(y1+1,y2,x2-1,x2,1) , y1+1 ) , y2 ); break;
   case 14: // |^ shape
            rep( y1,decif( findbeg(x1+1,x2,y1,y1+1,0) , x1+1) , x2 ,
                 x1,decif( findbeg(y1+1,y2,x1,x1+1,1) , y1+1) , y2 ); break;
   case 15: break; // impossible
    default: printf("Error\n"); // Internal error (should never happen)
  }

  return 0;
}
