#include <bits/stdc++.h>
using namespace std;
const long long MOGIC = -19260817;
const int U = (int)1.05e9;
struct info {
  long long sum, mnv;
  void set(long long S = 0ll, long long M = 0ll) {
    sum = S;
    mnv = M;
  }
} tmp;
info combine(info A, info B) {
  if (A.mnv <= B.mnv + A.sum)
    tmp.set(A.sum + B.sum, A.mnv);
  else
    tmp.set(A.sum + B.sum, B.mnv + A.sum);
  return tmp;
}
struct segT {
  int spd;
  info dat;
  segT *s[2];
  void init() {
    spd = 0;
    dat.set();
    s[0] = s[1] = 0;
  }
  inline segT *son(int d) {
    if (!s[d]) {
      s[d] = new segT;
      s[d]->init();
    }
    return s[d];
  }
  void push(int l = 0, int r = U) {
    if (spd != MOGIC) {
      if (l < r) {
        son(0)->spd = spd;
        son(1)->spd = spd;
      }
      dat.set((long long)spd * (long long)(r - l + 1),
              min((long long)spd * (long long)(r - l + 1), 0ll));
      spd = MOGIC;
    }
  }
  void set(int S, int L, int R, int l = 0, int r = U) {
    if (spd == S) {
      dat.set((long long)S * (long long)(r - l + 1),
              min((long long)S * (long long)(r - l + 1), 0ll));
      return;
    }
    if (l >= L && r <= R) {
      spd = S;
      push(l, r);
      return;
    }
    push(l, r);
    int M = (l + r) / 2;
    if (L <= M)
      s[0]->set(S, L, R, l, M);
    else
      s[0]->push(l, M);
    if (R > M)
      s[1]->set(S, L, R, M + 1, r);
    else
      s[1]->push(M + 1, r);
    dat = combine(s[0]->dat, s[1]->dat);
  }
  info qry(int L, int R, int l = 0, int r = U) {
    push(l, r);
    if (l >= L && r <= R) return dat;
    int M = (l + r) / 2;
    info ret;
    ret.set();
    if (L <= M) ret = s[0]->qry(L, R, l, M);
    if (R > M) ret = combine(ret, s[1]->qry(L, R, M + 1, r));
    return ret;
  }
  pair<long long, double> locate(int L, int R, long long V, int l = 0,
                                 int r = U) {
    push(l, r);
    if (l >= L && r <= R && dat.mnv + V > 0ll) {
      return make_pair(dat.sum, 0);
    }
    if (l == r) {
      return make_pair(MOGIC, (double)V / (double)(-dat.sum) + (double)l);
    }
    int M = (l + r) / 2;
    pair<long long, double> cur = make_pair(0, 0);
    if (L <= M) {
      cur = s[0]->locate(L, R, V, l, M);
      if (cur.first == MOGIC) return cur;
    }
    pair<long long, double> ret = s[1]->locate(L, R, V + cur.first, M + 1, r);
    if (ret.first != MOGIC) ret.first += cur.first;
    return ret;
  }
} * root;
set<pair<int, int> > st;
int q;
int main() {
  int i, j, k;
  scanf("%d", &q);
  root = new segT;
  root->init();
  st.insert(make_pair(0, 0));
  while (q--) {
    int tp;
    scanf("%d", &tp);
    if (tp == 1) {
      int t, s;
      scanf("%d%d", &t, &s);
      set<pair<int, int> >::iterator it = st.lower_bound(make_pair(t, s));
      root->set(s, t, (((it) == st.end()) ? U : ((it)->first - 1)));
      st.insert(make_pair(t, s));
    } else if (tp == 2) {
      int t;
      scanf("%d", &t);
      set<pair<int, int> >::iterator nx = st.lower_bound(make_pair(t, -U)),
                                     pr = nx++, cur = pr--;
      root->set(pr->second, cur->first,
                (((nx) == st.end()) ? U : ((nx)->first - 1)));
      st.erase(cur);
    } else {
      int l, r, v;
      scanf("%d%d%d", &l, &r, &v);
      --r;
      if (!v) {
        printf("%d\n", l);
        continue;
      }
      if (l > r || (int)st.size() == 1) {
        printf("-1\n");
        continue;
      }
      set<pair<int, int> >::iterator nx = st.lower_bound(make_pair(l, -U));
      if (nx == st.end() || nx->first > r) {
        printf("-1\n");
        continue;
      }
      l = nx->first;
      info R = root->qry(l, r);
      if (R.mnv + (long long)v <= 0ll)
        printf("%.7lf\n", root->locate(l, r, (long long)v).second);
      else
        printf("-1\n");
    }
  }
  return 0;
}
