#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &x, T y) {
  return x > y ? x = y, 1 : 0;
}
template <typename T>
inline bool chkmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
template <typename T>
inline void read(T &x) {
  char ch = getchar();
  int f = 1;
  x = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
int n, m, size[200050], t[200050], tl[200050], tr[200050], spd[200050],
    spdr[200050], ch[200050][2], rt, tcnt;
long long res[200050], mn[200050];
map<int, int> ok;
void update(int u) {
  size[u] = size[ch[u][0]] + size[ch[u][1]] + 1, res[u] = mn[u] = 0;
  tl[u] = ch[u][0] ? tl[ch[u][0]] : t[u],
  tr[u] = ch[u][1] ? tr[ch[u][1]] : t[u],
  spdr[u] = ch[u][1] ? spdr[ch[u][1]] : spd[u];
  if (ch[u][0])
    res[u] = res[ch[u][0]] + 1ll * spdr[ch[u][0]] * (t[u] - tr[ch[u][0]]),
    chkmin(mn[u], mn[ch[u][0]]), chkmin(mn[u], res[u]);
  if (ch[u][1])
    chkmin(mn[u], res[u] + 1ll * spd[u] * (tl[ch[u][1]] - t[u]) + mn[ch[u][1]]),
        res[u] += 1ll * spd[u] * (tl[ch[u][1]] - t[u]) + res[ch[u][1]];
}
int rnd() {
  static int x = 19260817;
  return x = (x * 48271ll) & INT_MAX;
}
int merge(int x, int y) {
  if (!x || !y) return x + y;
  int t;
  if (rnd() % (size[x] + size[y]) < size[x])
    t = x, ch[x][1] = merge(ch[x][1], y);
  else
    t = y, ch[y][0] = merge(x, ch[y][0]);
  update(t);
  return t;
}
void split(int u, int k, int &x, int &y) {
  if (!u)
    x = y = 0;
  else {
    if (t[u] <= k)
      x = u, split(ch[u][1], k, ch[u][1], y);
    else
      y = u, split(ch[u][0], k, x, ch[u][0]);
    update(u);
  }
}
int newnode(int ti, int v) {
  int u = ++tcnt;
  t[u] = tl[u] = tr[u] = ti, res[u] = mn[u] = 0, spd[u] = spdr[u] = v,
  size[u] = 1;
  return u;
}
double dfs(int u, long long st) {
  if (mn[u] > -st + (1e-6)) return -1;
  if (ch[u][0] && mn[ch[u][0]] <= -st + (1e-6)) return dfs(ch[u][0], st);
  long long lv = 1ll * spdr[ch[u][0]] * (t[u] - tr[ch[u][0]]),
            rv = 1ll * spd[u] * (tl[ch[u][1]] - t[u]),
            lf = ch[u][0] ? res[ch[u][0]] + lv : 0ll;
  if (ch[u][0] && lf <= -st + (1e-6))
    return tr[ch[u][0]] + 1.0 * (-st - res[ch[u][0]]) / spdr[ch[u][0]];
  if (ch[u][1] && lf + rv <= -st + (1e-6))
    return t[u] + 1.0 * (-st - lf) / spd[u];
  if (ch[u][1]) return dfs(ch[u][1], st + lf + rv);
  return -1;
}
void print() {
  cout << "print:\n";
  for (register int i = 1; i <= tcnt; ++i)
    cout << i << ": ls = " << ch[i][0] << " rs = " << ch[i][1]
         << " spd = " << spd[i] << " spdr = " << spdr[i] << " t = " << t[i]
         << " tl = " << tl[i] << " tr = " << tr[i] << " res = " << res[i]
         << " mn = " << mn[i] << endl;
}
void insert(int ti, int w) {
  int x, y;
  ok[ti] = 1;
  split(rt, ti, x, y), rt = merge(merge(x, newnode(ti, w)), y);
}
void erase(int ti) {
  int x, y, z;
  ok[ti] = 0;
  split(rt, ti, x, z), split(x, ti - 1, x, y), rt = merge(x, z);
}
int main() {
  int op, l, r, s;
  int x, y, z;
  read(n);
  for (register int i = 1; i <= n; ++i) {
    read(op);
    if (op == 1)
      read(l), read(s), insert(l, s);
    else if (op == 2)
      read(l), erase(l);
    else {
      read(l), read(r), read(s);
      if (!s)
        printf("%d\n", l);
      else {
        bool f = 0;
        if (!ok[r]) f = 1, insert(r, 0);
        split(rt, r, x, z), split(x, l - 1, x, y);
        printf("%.10lf\n", dfs(y, s));
        rt = merge(merge(x, y), z);
        if (f) erase(r);
      }
    }
  }
  return 0;
}
