#include <bits/stdc++.h>
using namespace std;
class Node {
 public:
  long long res, mini;
  Node *l, *r;
  int s, e, cnt, bound, rate;
  Node(int a, int b) {
    l = NULL;
    r = NULL;
    cnt = 0;
    s = a;
    e = b;
  }
  void upd(int loc, int rat, int bnd) {
    if (s == e) {
      bound = bnd;
      rate = rat;
      res = (long long)(bound - loc) * (long long)rate;
      mini = min(0LL, res);
      if (bound == loc) {
        cnt = 0;
      } else {
        cnt = 1;
      }
    } else {
      if (loc <= (s + e) / 2) {
        if (l == NULL) {
          l = new Node(s, (s + e) / 2);
        }
        l->upd(loc, rat, bnd);
      } else {
        if (r == NULL) {
          r = new Node((s + e) / 2 + 1, e);
        }
        r->upd(loc, rat, bnd);
      }
      mini = 0LL;
      res = 0LL;
      cnt = 0;
      if (l != NULL) {
        res = l->res;
        cnt += l->cnt;
        mini = min(mini, l->mini);
      }
      if (r != NULL) {
        mini = min(mini, res + r->mini);
        res += r->res;
        cnt += r->cnt;
      }
    }
  }
  pair<int, int> last(int st, int en) {
    if (st <= s && e <= en && cnt == 0) {
      return make_pair(-1, -1);
    }
    if (s == e) {
      if (cnt == 0) {
        return make_pair(-1, -1);
      }
      return make_pair(s, rate);
    }
    pair<int, int> ret = make_pair(-1, -1);
    if (en > (s + e) / 2 && r != NULL) {
      ret = r->last(st, en);
    }
    if (st <= (s + e) / 2 && ret.first == -1 && l != NULL) {
      ret = l->last(st, en);
    }
    return ret;
  }
  pair<int, int> first(int st, int en) {
    if (st <= s && e <= en && cnt == 0) {
      return make_pair(-1, -1);
    }
    if (s == e) {
      if (cnt == 0) {
        return make_pair(-1, -1);
      }
      return make_pair(s, rate);
    }
    pair<int, int> ret = make_pair(-1, -1);
    if (l != NULL && st <= (s + e) / 2) {
      ret = l->first(st, en);
    }
    if (en > (s + e) / 2 && ret.first == -1 && r != NULL) {
      ret = r->first(st, en);
    }
    return ret;
  }
  pair<long double, long long> get(int st, int en, long long rem) {
    if (st <= s && e <= en) {
      if (rem + mini <= 0LL) {
        if (s == e) {
          if (rem == 0) {
            return make_pair((long double)s, 123LL);
          }
          assert(rate < 0.5);
          long double ans = (long double)s - ((long double)rem / rate);
          return make_pair(ans, 123LL);
        }
        if (l != NULL && rem + l->mini <= 0LL) {
          return l->get(st, en, rem);
        } else {
          if (l != NULL) {
            rem += l->res;
          }
          return r->get(st, en, rem);
        }
      }
      return make_pair(-69.0, rem + res);
    }
    if (st <= (s + e) / 2 && l != NULL) {
      pair<long double, long long> tmp = l->get(st, en, rem);
      if (tmp.first > -60.0) {
        return tmp;
      }
      rem = tmp.second;
    }
    if (en > (s + e) / 2 && r != NULL) {
      pair<long double, long long> tmp = r->get(st, en, rem);
      if (tmp.first > -60.0) {
        return tmp;
      }
      rem = tmp.second;
    }
    return make_pair(-69.0, rem);
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  Node *node = new Node(0, 1000000000);
  int q;
  cin >> q;
  for (int z = 1; z <= q; z++) {
    int tp;
    cin >> tp;
    if (tp == 1) {
      int t, s;
      cin >> t >> s;
      pair<int, int> bef = node->last(0, t - 1);
      pair<int, int> aft = node->first(t, 1000000000);
      if (bef.first != -1) {
        node->upd(bef.first, bef.second, t);
      }
      int bnd = 1000000001;
      if (aft.first != -1) {
        bnd = aft.first;
      }
      node->upd(t, s, bnd);
    } else if (tp == 2) {
      int t;
      cin >> t;
      pair<int, int> bef = node->last(0, t - 1);
      node->upd(t, 0, t);
      if (bef.first == -1) {
        continue;
      }
      pair<int, int> aft = node->first(t, 1000000000);
      int bnd = 1000000001;
      if (aft.first != -1) {
        bnd = aft.first;
      }
      node->upd(bef.first, bef.second, bnd);
    } else {
      int l, r;
      long long v;
      cin >> l >> r >> v;
      int ogr = r;
      if (v == 0) {
        cout << l << endl;
        continue;
      }
      pair<int, int> las = node->last(l, r);
      if (las.first == -1) {
        cout << "-1" << endl;
        continue;
      }
      r = las.first - 1;
      if (l <= r && node->last(l, r).first != -1) {
        pair<long double, long long> val = node->get(l, r, v);
        if (val.first > -60.0) {
          cout << fixed << setprecision(6) << val.first << endl;
          continue;
        } else {
          v = val.second;
        }
      }
      assert(v > 0);
      if (las.second >= 0) {
        cout << "-1" << endl;
      } else {
        long long can = (long long)(ogr - las.first) * (long long)(-las.second);
        if (can < v) {
          cout << "-1" << endl;
          continue;
        }
        long double ans = (long double)las.first +
                          ((long double)v / (long double)(-las.second));
        cout << fixed << setprecision(6) << ans << endl;
      }
    }
  }
}
