#include <bits/stdc++.h>
const int N = 800005;
int q;
int opt[N], x[N], y[N];
long long z[N];
int val[N], tot;
std::set<int> set;
int prev(int x) {
  std::set<int>::iterator it = set.find(x);
  return it == set.begin() ? 0 : *--it;
}
int next(int x) {
  std::set<int>::iterator it = set.find(x);
  return ++it == set.end() ? tot : *it;
}
int weight[N];
long long tag[N], min[N], max[N];
void setadd(int o, long long v) { tag[o] += v, min[o] += v, max[o] += v; }
void pushdown(int o) {
  setadd(o << 1, tag[o]), setadd(o << 1 | 1, tag[o]), tag[o] = 0;
}
void pushup(int o) {
  min[o] = std::min(min[o << 1], min[o << 1 | 1]);
  max[o] = std::max(max[o << 1], max[o << 1 | 1]);
}
void modify(int L, int R, long long v, int o = 1, int l = 1, int r = tot) {
  if (L <= l && R >= r) return setadd(o, v);
  int mid = l + r >> 1;
  pushdown(o);
  if (L <= mid) modify(L, R, v, o << 1, l, mid);
  if (R > mid) modify(L, R, v, o << 1 | 1, mid + 1, r);
  pushup(o);
}
long long query(int pos, int o = 1, int l = 1, int r = tot) {
  if (l == r) return min[o];
  int mid = l + r >> 1;
  pushdown(o);
  if (pos <= mid)
    return query(pos, o << 1, l, mid);
  else
    return query(pos, o << 1 | 1, mid + 1, r);
}
int find(int L, long long val, bool &m, bool &M, int o = 1, int l = 1,
         int r = tot) {
  if (L <= l && (!(m || min[o] <= val) || !(M || max[o] >= val)))
    return m |= min[o] <= val, M |= max[o] >= val, -1;
  if (l == r) return l;
  int mid = l + r >> 1;
  pushdown(o);
  int ret = -1;
  if (L <= mid) ret = find(L, val, m, M, o << 1, l, mid);
  if (ret != -1) return ret;
  return find(L, val, m, M, o << 1 | 1, mid + 1, r);
}
int main() {
  std::ios::sync_with_stdio(0), std::cin.tie(0);
  std::cin >> q;
  for (int i = 1; i <= q; ++i) {
    std::cin >> opt[i];
    if (opt[i] == 1)
      std::cin >> x[i] >> y[i], val[++tot] = x[i];
    else if (opt[i] == 2)
      std::cin >> x[i];
    else {
      std::cin >> x[i] >> y[i] >> z[i];
      val[++tot] = x[i], val[++tot] = y[i];
    }
  }
  val[++tot] = 1e9, val[++tot] = 0;
  std::sort(val + 1, val + tot + 1);
  tot = std::unique(val + 1, val + tot + 1) - val - 1;
  for (int i = 1; i <= q; ++i) {
    x[i] = std::lower_bound(val + 1, val + tot + 1, x[i]) - val;
    if (opt[i] == 3)
      y[i] = std::lower_bound(val + 1, val + tot + 1, y[i]) - val;
  }
  for (int i = 1; i <= q; ++i) {
    if (opt[i] == 1) {
      set.insert(x[i]), weight[x[i]] = y[i];
      int pre = prev(x[i]), nxt = next(x[i]);
      if (nxt > x[i])
        modify(x[i], nxt - 1, (long long)(val[x[i]] - val[pre]) * weight[pre]);
      modify(nxt, tot,
             (long long)(val[nxt] - val[x[i]]) * (weight[x[i]] - weight[pre]));
    } else if (opt[i] == 2) {
      int pre = prev(x[i]), nxt = next(x[i]);
      set.erase(x[i]);
      if (nxt > x[i])
        modify(x[i], nxt - 1, (long long)-(val[x[i]] - val[pre]) * weight[pre]);
      modify(nxt, tot,
             (long long)-(val[nxt] - val[x[i]]) * (weight[x[i]] - weight[pre]));
    } else {
      if (z[i] == 0) {
        std::cout << val[x[i]] << '\n';
        continue;
      }
      std::set<int>::iterator it = set.lower_bound(x[i]);
      if (it == set.end() || *it > y[i]) {
        std::cout << "-1\n";
        continue;
      }
      x[i] = *it, z[i] = query(x[i]) - z[i];
      bool m = 0, M = 0;
      int q = find(x[i], z[i], m, M);
      if (q == -1) {
        std::cout << "-1\n";
        continue;
      }
      int lst = prev(q);
      z[i] -= query(lst);
      if (weight[lst] > 0) {
        if (z[i] > (long long)(val[y[i]] - val[lst]) * weight[lst]) {
          std::cout << "-1\n";
          continue;
        }
      } else {
        if (z[i] < (long long)(val[y[i]] - val[lst]) * weight[lst]) {
          std::cout << "-1\n";
          continue;
        }
      }
      std::cout << std::fixed << std::setprecision(10)
                << val[lst] + (double)z[i] / weight[lst] << '\n';
    }
  }
  return 0;
}
