#include <bits/stdc++.h>
#define ll long long
#define x first
#define y second
#define ld long double

using namespace std;


int n,h,q;
int uso=0;
ld r;
//vector<pair<int,int> >k;
pair<int,int> seg[500010];

ld racunaj(pair<int,int> krug, int x)
{
    if(krug.x==0 && krug.y==0)
        return h;
    ld dx=abs(krug.x-x);
    if(dx>=r)
        return h;
    ld dr=sqrt(r*r-dx*dx);
    ld ret=min((ld)h,krug.y-dr);
    return max(ret,(ld)0);
}

void postavi(int t, int l, int r)
{
    seg[t].x=seg[t].y=0;
    //seg[t].push_back(make_pair(0,0));
    if(l==r)
        return;
    int mid=(l+r)/2;
    postavi(2*t, l, mid);
    postavi(2*t+1,mid+1,r);
}

ld query(int t, int l, int r, int x)
{
    if(l==r)
    {
        ld sol=racunaj(seg[t],x);
        /*for(int i=0;i<seg[t].size();i++)
            sol=min(sol,racunaj(seg[t][i],x));*/
        return sol;
    }
    int mid=(l+r)/2;
    ld rek;
    if(x<=mid) rek=query(2*t,l,mid,x);
    else rek=query(2*t+1,mid+1,r,x);
    ld teksol=racunaj(seg[t],x);
    /*for(int i=0;i<seg[t].size();i++)
            teksol=min(teksol,racunaj(seg[t][i],x));*/
    return min(teksol, rek);
}

bool bolji(pair<int,int> stari, pair<int,int> novi, int l, int r)
{
    if(stari.x==0 && stari.y==0)
        return true;
    if(stari.x==novi.x && stari.y>=novi.y)
        return true;

    ld d1=racunaj(novi,l);
    ld d2=racunaj(stari,l);

    ld d3=racunaj(novi,r);
    ld d4=racunaj(stari,r);

    if(d1<d2 && d3<d4)
        return true;

    return false;
}

bool gori(pair<int,int> stari, pair<int,int> novi, int l, int r)
{
    if(stari.x==novi.x && stari.y<novi.y)
        return true;

    ld d1=racunaj(novi,l);
    ld d2=racunaj(stari,l);

    ld d3=racunaj(novi,r);
    ld d4=racunaj(stari,r);

    if(d2<d1 && d4<d3)
        return true;
    return false;
}

int binarna1(pair<int,int> novi, pair<int,int> stari, int l, int r) //poslednji manji
{
    while(l<r)
    {
        //cout<<"*"<<l<<" "<<r<<endl;
        int sr=(l+r+1)/2;
        ld d1=racunaj(novi,sr);
        ld d2=racunaj(stari,sr);
        //cout<<"+"<<d1<<" "<<d2<<endl;
        if(d1<d2) l=sr;
        else r=sr-1;
    }
    return l;
}

int binarna2(pair<int,int> novi, pair<int,int> stari, int l, int r) //prvi manji
{
    while(l<r)
    {
        int sr=(l+r)/2;
        ld d1=racunaj(novi,sr);
        ld d2=racunaj(stari,sr);
        if(d1<d2) r=sr;
        else l=sr+1;
    }
    //cout<<"*"<<l<<endl;
    return l;
}

void update(int t, int l, int r, int L, int R, pair<int,int> krug)
{

    if(l>R || L>r)
        return;

    if(l>=L && r<=R)
    {
        /*seg[t].push_back(krug);
        return;*/
        if(bolji(seg[t],krug, l, r))
        {
            seg[t]=krug;
            return;
        }
        if(gori(seg[t],krug,l,r))
            return;

        //for(;;);
        //cout<<"PROSO"<<endl;

        /*if(l==r)
        {
            ld d1=racunaj(krug,l);
            ld d2=racunaj(seg[t],l);
            if(d1<d2) seg[t]=krug;
            return;
        }*/

        if(krug.x<seg[t].x)
        {
            //for(;;);
            //cout<<"USO"<<endl;
            ld d1=racunaj(krug,l);
            ld d2=racunaj(seg[t],l);
            if(d2<d1) return;
            int presek=binarna1(krug, seg[t],l,r);
            if(presek==r)
            {
                //cout<<"********"<<seg[t].x<<" "<<seg[t].y<<"   "<<krug.x<<" "<<krug.y<<endl;
                uso++;
                seg[t]==krug;
                return;
            }
            R=presek;
        }
        else
        {
           //for(;;);
            //cout<<"USO"<<endl;

            ld d1=racunaj(krug,r);
            ld d2=racunaj(seg[t],r);
            if(d2<d1) return;
            int presek=binarna2(krug, seg[t],l,r);
            if(presek==l)
            {
                seg[t]==krug;
                return;
            }
            L=presek;
        }
    }
    int mid=(l+r)/2;
    update(2*t,l,mid,L,R,krug);
    update(2*t+1,mid+1,r,L,R,krug);
}

/*ld bruteForce(int x)
{
    ld sol=h;
    for(int i=0;i<k.size();i++)
    {
        ld tek=racunaj(k[i],x);
        sol=min(sol,tek);
    }
    return sol;

}*/

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	/*if(!dbg)*/ cin>>n>>h>>r>>q;
    //else input>>n>>h>>r>>q;
	int t, x,y;
	cout<<setprecision(11);
	cout<<fixed;
	int cnt=0;
	while(q--)
    {
         cin>>t>>x;

        if(t==1)
        {
            cin>>y;
            if(y>=h+r)
                continue;
            //k.push_back(make_pair(x,y));
            update(1,0,n-1,max((ld)0,x-r+1),min(x+r-1,(ld)n),make_pair(x,y));
        }
        else
        {
            //ld bf=bruteForce(x);
            ld q=query(1,0,n-1,x);
            //if(bf!=q)
            //    cnt++;
            //cout<<bf<<" "<<q<<endl;
            cout<<q<<endl;
        }
    }
    //cout<<cnt<<endl;
	return 0;
}