#include <bits/stdc++.h>
using namespace std;
long double EPS = 1e-8;
const long long NMAX = 111111;
const long long inf = 2e9;
const long long M = 1e9 + 7;
struct vertex {
  long long second;
  long long t, s;
  vertex *l, *r;
  long long tl, tr;
  long long res, mn;
  long long sr;
} g[NMAX];
vertex *ls = g + 1;
vertex *nver(long long t, long long s) {
  ls->second = rand() | (rand() << 15);
  ls->t = t;
  ls->s = s;
  ls->l = g;
  ls->r = g;
  ls->tl = t;
  ls->tr = t;
  ls->sr = s;
  ls->res = 0;
  ls->mn = 0;
  return ls++;
}
void update(vertex *v) {
  if (v == g) return;
  v->res = 0;
  v->mn = 0;
  long long cur = 0;
  if (v->l != g) {
    v->res += v->l->res;
    v->res += (v->t - v->l->tr) * v->l->sr;
    cur += v->res;
    v->tl = v->l->tl;
    v->mn = min(v->mn, min(v->l->mn, cur));
  } else {
    v->tl = v->t;
  }
  if (v->r != g) {
    cur += (v->r->tl - v->t) * v->s;
    v->mn = min(v->mn, v->r->mn + cur);
    v->res += v->r->res;
    v->res += (v->r->tl - v->t) * v->s;
    v->tr = v->r->tr;
    v->sr = v->r->sr;
  } else {
    v->tr = v->t;
    v->sr = v->s;
  }
  return;
}
vertex *merge(vertex *l, vertex *r) {
  if (l == g) return r;
  if (r == g) return l;
  if (l->second < r->second) {
    r->l = merge(l, r->l);
    update(r);
    return r;
  }
  l->r = merge(l->r, r);
  update(l);
  return l;
}
pair<vertex *, vertex *> split(vertex *t, long long first) {
  if (t == g) return {g, g};
  if (t->t < first) {
    auto w = split(t->r, first);
    t->r = w.first;
    update(t);
    return {t, w.second};
  } else {
    auto w = split(t->l, first);
    t->l = w.second;
    update(t);
    return {w.first, t};
  }
}
long double ans(vertex *t, long long v, long long tr) {
  long long mn = 0;
  long long cur = 0;
  if (t->l != g) {
    cur += (t->t - t->l->tr) * t->l->sr + t->l->res;
    mn = min(mn, min(t->l->mn, cur));
    if (v + mn <= 0) return ans(t->l, v, t->t);
  }
  if (t->s < 0) {
    long long k = tr;
    if (t->r != g) k = t->r->tl;
    if ((v + cur) <= -t->s * (k - t->t))
      return t->t - (long double)(v + cur) / t->s;
  }
  if (t->r == g) {
    return -1;
  }
  return ans(t->r, v + cur + (t->s) * (t->r->tl - t->t), tr);
}
void debug(vertex *v) {
  if (v == g) return;
  debug(v->l);
  cout << v->second << ' ' << v->s << ' ' << v->res << ' ' << v->mn << endl;
  debug(v->r);
  return;
}
signed main() {
  cin.sync_with_stdio(0);
  cout.sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout.precision(40);
  long long q;
  cin >> q;
  vertex *t = g;
  for (long long i = 1; i <= q; i++) {
    long long w;
    cin >> w;
    if (w == 1) {
      long long tm, s;
      cin >> tm >> s;
      auto w = split(t, tm);
      t = merge(w.first, merge(nver(tm, s), w.second));
    } else if (w == 2) {
      long long tm;
      cin >> tm;
      auto w = split(t, tm);
      auto e = split(w.second, tm + 1);
      t = merge(w.first, e.second);
    } else {
      long long l, r, v;
      cin >> l >> r >> v;
      if (v == 0) {
        cout << l << endl;
        continue;
      }
      auto w = split(t, l);
      auto e = split(w.second, r);
      if (e.first == g) {
        cout << -1 << endl;
      } else
        cout << ans(e.first, v, r) << endl;
      t = merge(w.first, merge(e.first, e.second));
    }
  }
  return 0;
}
