#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, M = N << 2, inf = 0x3f3f3f3f;
int num[N];
int read() {
  int ret = 0, f = 0;
  char c = getchar();
  while (!isdigit(c)) f |= (c == '-'), c = getchar();
  while (isdigit(c)) ret = ret * 10 + (c ^ 48), c = getchar();
  return f ? -ret : ret;
}
namespace Data_Structure {
struct Segment {
  long long sum[M], si[M], tar[M];
  void pushdown(int x, int l, int r) {
    if (tar[x] == inf) return;
    int mid = (l + r) >> 1;
    long long t = tar[x];
    tar[x] = inf;
    sum[(x << 1)] = t * (num[mid + 1] - num[l]);
    si[(x << 1)] = min(0ll, sum[(x << 1)]);
    sum[(x << 1 | 1)] = t * (num[r + 1] - num[mid + 1]);
    si[(x << 1 | 1)] = min(0ll, sum[(x << 1 | 1)]);
    tar[(x << 1)] = tar[(x << 1 | 1)] = t;
  }
  void pushup(int x) {
    sum[x] = sum[(x << 1)] + sum[(x << 1 | 1)];
    si[x] = min(si[(x << 1)], sum[(x << 1)] + si[(x << 1 | 1)]);
  }
  void update(int x, int l, int r, int L, int R, long long v) {
    if (L <= l && r <= R) {
      sum[x] = v * (num[r + 1] - num[l]);
      si[x] = min(0ll, sum[x]);
      tar[x] = v;
      return;
    }
    pushdown(x, l, r);
    int mid = (l + r) >> 1;
    if (L <= mid) update((x << 1), l, mid, L, R, v);
    if (R > mid) update((x << 1 | 1), mid + 1, r, L, R, v);
    pushup(x);
  }
  pair<long long, int> query(int x, int l, int r, long long v) {
    if (l == r) return make_pair(v, l);
    pushdown(x, l, r);
    int mid = (l + r) >> 1;
    if (v + si[(x << 1)] <= 0)
      return query((x << 1), l, mid, v);
    else
      return query((x << 1 | 1), mid + 1, r, v + sum[(x << 1)]);
  }
  pair<long long, int> query1(int x, int l, int r, int L, int R, long long v) {
    if (L <= l && r <= R) {
      return (v + si[x] <= 0) ? query(x, l, r, v) : make_pair(v + sum[x], -1);
    }
    pushdown(x, l, r);
    int mid = (l + r) >> 1;
    pair<long long, int> res = make_pair(v, -1);
    if (L <= mid) res = query1((x << 1), l, mid, L, R, v);
    if (R > mid && !~res.second)
      res = query1((x << 1 | 1), mid + 1, r, L, R, res.first);
    return res;
  }
  long long query2(int x, int l, int r, int p) {
    if (l == r) return tar[x];
    pushdown(x, l, r);
    int mid = (l + r) >> 1;
    if (p <= mid)
      return query2((x << 1), l, mid, p);
    else
      return query2((x << 1 | 1), mid + 1, r, p);
  }
} tr;
}  // namespace Data_Structure
using namespace Data_Structure;
namespace DreamLolita {
int Q, n;
set<int> st;
struct Tquery {
  int op, l, r, v;
  Tquery(int _o = 0, int _l = 0, int _r = 0, int _v = 0)
      : op(_o), l(_l), r(_r), v(_v) {}
} q[N];
void solution() {
  Q = read();
  for (int i = 1; i <= Q; ++i) {
    int op = read(), x, y, z;
    if (op == 1) {
      x = read();
      y = read();
      q[i] = Tquery(1, x, 0, y);
      num[++n] = x;
    } else if (op == 2) {
      x = read();
      q[i] = Tquery(2, x, x, 0);
      num[++n] = x;
    } else {
      x = read();
      y = read();
      z = read();
      q[i] = Tquery(3, x, y, z);
      num[++n] = x;
      num[++n] = y;
    }
  }
  num[++n] = 0;
  num[++n] = 1e9 + 1;
  sort(num + 1, num + n + 1);
  n = unique(num + 1, num + n + 1) - num - 1;
  st.insert(1);
  st.insert(n);
  for (int i = 1; i <= Q; ++i) {
    if (q[i].op == 1) {
      int x = lower_bound(num + 1, num + n + 1, q[i].l) - num;
      st.insert(x);
      set<int>::iterator it = st.lower_bound(x);
      ++it;
      int y = *it;
      tr.update(1, 1, n, x, y - 1, q[i].v);
    } else if (q[i].op == 2) {
      int x = lower_bound(num + 1, num + n + 1, q[i].l) - num;
      set<int>::iterator it = st.lower_bound(x), it2 = it;
      --it;
      ++it2;
      int y = *it, z = *it2;
      st.erase(x);
      tr.update(1, 1, n, x, z - 1, tr.query2(1, 1, n, y));
    } else {
      if (!q[i].v) {
        printf("%d\n", q[i].l);
        continue;
      }
      int x = lower_bound(num + 1, num + n + 1, q[i].l) - num,
          y = lower_bound(num + 1, num + n + 1, q[i].r) - num - 1;
      set<int>::iterator it = st.lower_bound(x);
      x = *it;
      if (x > y) {
        puts("-1");
        continue;
      }
      pair<long long, int> res = tr.query1(1, 1, n, x, y, q[i].v);
      if (~res.second) {
        double v = tr.query2(1, 1, n, res.second);
        printf("%.10lf\n", num[res.second] - (double)res.first / v);
      } else
        puts("-1");
    }
  }
}
}  // namespace DreamLolita
int main() {
  DreamLolita::solution();
  return 0;
}
