#include <bits/stdc++.h>

using namespace std;

typedef vector<int> vi;
typedef vector<double> vd;

void mrs(vi& niz, vi& pom, int nniz, int npom)
{ int i, k;
  i=nniz-1; k=npom-1;
  while(i>=0&&k>=0)
  { if(niz[i]>pom[k]){niz[i+k+1]=niz[i]; i--;}
    else {niz[i+k+1]=pom[k]; k--;}
  }
  while(k>=0){niz[k]=pom[k]; k--;}
}

int lowa(vi& veka, int gore, int val)
{ int sred, dole=0;
  while(dole<=gore)
  { sred=(gore+dole)/2;
    if(veka[sred]<val)dole=sred+1;
    else gore=sred-1;
  }
  return dole;
}

int main()
{ ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int i, k, n, val, tmp, w, h, r, r2, p, q, x, y, dpom, nniz, npom;
  int nar, maxa, dota, levo, dalj, desno;
  double dx, dy, rast, mina;
  cin>> w>> h>> r>> q;
  vi tac(w+1);
  if(w>r-1)val=r-1;
  else val=w;
  vd rd(val+1);
  r2=r*r;
  for(i=0; i<=val; i++)
  { rast=r2-i*i;
    rd[i]=sqrt(rast);
  }
  if(r>20)
  { vi niz(q+1);
    vi pom(10001);
    dpom=10001;
    nniz=0; npom=0;
    for(p=1; p<=q; p++)
    { cin>> nar;
      if(nar==1)
      { cin>> x>> y;
        if(tac[x]==0)
        { tac[x]=y; pom[npom]=x; npom++;
          if(npom==dpom-10){dpom+=10000; pom.resize(dpom);}
        }
        else if(tac[x]>y)tac[x]=y;
      }
      else
      { cin>> x;
        sort(pom.begin(), pom.begin()+npom );
        mrs(niz, pom, nniz, npom);
        nniz+=npom; npom=0;
        mina=h;
        levo=x-r+1; if(levo<0)levo=0;
        desno=x+r-1; if(desno>w)desno=w;
        dota=lowa(niz, nniz-1, levo);
        while(dota<nniz&&niz[dota]<=desno)
        { rast=tac[niz[dota]];
          if(rast>0)
          { dalj=x-niz[dota]; if(dalj<0)dalj=-dalj;
            rast-=rd[dalj];
            if(rast<mina)mina=rast;
          }
          dota++;
        }
        cout<< fixed<< showpoint<< setprecision(9)<< mina<< "\n";
      }
    }
  }
  else
  { for(p=1; p<=q; p++)
    { cin>> nar;
      if(nar==1)
      { cin>> x>> y;
        if(tac[x]==0)tac[x]=y;
        else
        if(tac[x]>y)tac[x]=y;
      }
      else
      { cin>> x;
        mina=h;
        levo=x-r+1; if(levo<0)levo=0;
        desno=x+r-1; if(desno>w)desno=w;
        for(i=levo; i<=desno; i++)
        { rast=tac[i];
          if(rast>0)
          { dalj=x-i; if(dalj<0) dalj=-dalj;
            rast-=rd[dalj];
            if(rast<mina)mina=rast;
          }
        }
        cout<< fixed<< showpoint<< setprecision(9)<< mina<< "\n";
      }
    }
  }

  return 0;
}