#include <bits/stdc++.h>
using namespace std;
const int maxn = 200010;
const int inf = 1.01e9;
struct segtree {
  segtree *ch[2];
  int setv;
  long long minv, sumv;
  segtree() : minv(0), sumv(0), setv(-inf) { ch[0] = ch[1] = NULL; }
  void label(int s, int sz) {
    setv = s;
    minv = sumv = 1ll * s * sz;
    minv = min(minv, 0ll);
  }
  void pushdown(bool isLeaf, int sz) {
    if (setv == -inf) return;
    if (!isLeaf) {
      assert(ch[0] && ch[1]);
      ch[0]->label(setv, (sz + 1) / 2);
      ch[1]->label(setv, sz / 2);
    }
    setv = -inf;
  }
  void maintain() {
    sumv = minv = 0;
    if (ch[0]) sumv += ch[0]->sumv, minv = ch[0]->minv;
    if (ch[1]) minv = min(minv, sumv + ch[1]->minv), sumv += ch[1]->sumv;
  }
};
segtree *pool;
int nd_rest = 0;
inline segtree *newnode() {
  if (!nd_rest) pool = new segtree[50000], nd_rest = 50000;
  segtree *ret = pool + (--nd_rest);
  return ret;
}
int ql, qr, val;
long long rest;
double ans;
void modify(segtree *&o, int l, int r) {
  if (!o) o = newnode();
  if (ql <= l && r <= qr) {
    o->label(val, r - l + 1);
    return;
  }
  int mid = l + (r - l) / 2;
  if (!o->ch[0]) o->ch[0] = newnode();
  if (!o->ch[1]) o->ch[1] = newnode();
  o->pushdown(l == r, r - l + 1);
  if (ql <= mid) modify(o->ch[0], l, mid);
  if (mid < qr) modify(o->ch[1], mid + 1, r);
  o->maintain();
}
void query(segtree *&o, int l, int r) {
  if (!o) o = newnode();
  if (rest == 0) return;
  int mid = l + (r - l) / 2;
  if (ql <= l && r <= qr) {
    if (o->minv + rest > 0) {
      rest += o->sumv;
      return;
    }
  }
  if (l == r) {
    ans = l - 1.0 * rest / o->sumv;
    rest = 0;
    return;
  }
  if (!o->ch[0]) o->ch[0] = newnode();
  if (!o->ch[1]) o->ch[1] = newnode();
  o->pushdown(l == r, r - l + 1);
  if (ql <= mid) query(o->ch[0], l, mid);
  if (mid < qr) query(o->ch[1], mid + 1, r);
  o->maintain();
}
segtree *root;
set<pair<int, int> > event;
void add(int t, int s) {
  event.insert(make_pair(t, s));
  auto now = event.lower_bound(make_pair(t, inf));
  ql = t;
  qr = now->first - 1;
  val = s;
  modify(root, 0, inf - 1);
}
void del(int t) {
  auto now = event.lower_bound(make_pair(t, -inf));
  auto pre = now;
  pre--;
  auto nxt = now;
  nxt++;
  ql = pre->first;
  qr = (nxt->first) - 1;
  val = pre->second;
  modify(root, 0, inf - 1);
  event.erase(now);
}
void query(int l, int r, int v) {
  if (!v) {
    cout << l << endl;
    return;
  }
  int flag = 0;
  auto now = event.lower_bound(make_pair(l, -inf));
  if (now->first != l) {
    flag = 1;
    add(l, 0);
  }
  ans = -1;
  ql = l;
  qr = r - 1;
  rest = v;
  query(root, 0, inf - 1);
  printf("%.10f\n", ans);
  if (flag) del(l);
}
int q, opt, t, s, l, r, v;
int main() {
  event.insert(make_pair(0, 0));
  event.insert(make_pair(inf, 0));
  cin >> q;
  for (int i = 1; i <= q; i++) {
    scanf("%d", &opt);
    if (opt == 1) {
      scanf("%d%d", &t, &s);
      add(t, s);
    } else if (opt == 2) {
      scanf("%d", &t);
      del(t);
    } else {
      scanf("%d%d%d", &l, &r, &v);
      query(l, r, v);
    }
  }
  return 0;
}
