#include <bits/stdc++.h>
using namespace std;
const int NMAX = 350009;
long long Q, N, currentS[NMAX], s[NMAX], t[NMAX], l[NMAX], r[NMAX], v[NMAX],
    type[NMAX];
vector<long long> ts;
map<long long, long long> inverseT;
void read() {
  scanf("%I64d", &Q);
  for (int i = 1; i <= Q; i++) {
    scanf("%I64d", &type[i]);
    if (type[i] == 1)
      scanf("%I64d %I64d", &t[i], &s[i]), ts.push_back(t[i]);
    else if (type[i] == 2)
      scanf("%I64d", &t[i]);
    else {
      scanf("%I64d %I64d %I64d", &l[i], &r[i], &v[i]);
      ts.push_back(l[i]), ts.push_back(r[i]);
    }
  }
  sort(ts.begin(), ts.end());
  ts.erase(unique(ts.begin(), ts.end()), ts.end()), N = ts.size();
  for (long long i = 0; i < N; i++) inverseT[ts[i]] = i + 1;
  long long lastVal = ts[N - 1];
  ts.push_back(lastVal);
  for (int i = 1; i <= Q; i++)
    if (type[i] <= 2)
      t[i] = inverseT[t[i]];
    else
      l[i] = inverseT[l[i]], r[i] = inverseT[r[i]];
}
set<long long> currTimes;
long long sum[4 * NMAX], mi[4 * NMAX];
long long vl[4 * NMAX];
bool lzy[4 * NMAX];
long long getLength(long long x, long long y) { return ts[y] - ts[x - 1]; }
void split(long long nod, long long st, long long mij, long long dr,
           long long f1, long long f2) {
  if (lzy[nod] == 0) return;
  lzy[f1] = lzy[f2] = 1;
  vl[f1] = vl[f2] = vl[nod];
  sum[f1] = 1LL * vl[nod] * getLength(st, mij);
  mi[f1] = min(0LL, sum[f1]);
  sum[f2] = 1LL * vl[nod] * getLength(mij + 1, dr);
  mi[f2] = min(0LL, sum[f2]);
  lzy[nod] = 0;
}
void setValue(long long nod, long long st, long long dr, long long x,
              long long y, long long s) {
  if (x <= st && dr <= y) {
    vl[nod] = s, lzy[nod] = 1;
    sum[nod] = 1LL * s * getLength(st, dr);
    mi[nod] = min(0LL, sum[nod]);
    return;
  }
  long long mij = (st + dr) >> 1, f1 = nod << 1, f2 = f1 | 1;
  split(nod, st, mij, dr, f1, f2);
  if (x <= mij) setValue(f1, st, mij, x, y, s);
  if (mij < y) setValue(f2, mij + 1, dr, x, y, s);
  sum[nod] = sum[f1] + sum[f2];
  mi[nod] = min(mi[f1], sum[f1] + mi[f2]);
}
long double ansQ = -1.0;
const long double eps = 1e-9;
long long curr;
void query(long long nod, long long st, long long dr, long long x,
           long long y) {
  if (ansQ > -0.5) return;
  if (x <= st && dr <= y) {
    long long mij = (st + dr) >> 1, f1 = nod << 1, f2 = f1 | 1;
    if (st == dr) {
      if (mi[nod] + curr > 0) {
        curr += sum[nod];
        return;
      }
      long long t1 = ts[st - 1], t2 = ts[st];
      assert(vl[nod] < 0);
      ansQ = t1 + 1.0 * curr / (-vl[nod]);
      assert(ansQ > -0.5);
      return;
    }
    split(nod, st, mij, dr, f1, f2);
    if (curr + mi[f1] <= 0) {
      query(f1, st, mij, x, y);
      assert(ansQ > -0.5);
    } else if (curr + sum[f1] + mi[f2] <= 0) {
      curr += sum[f1], query(f2, mij + 1, dr, x, y);
      assert(ansQ > -0.5);
    } else
      curr += sum[nod];
    return;
  }
  long long mij = (st + dr) >> 1, f1 = nod << 1, f2 = f1 | 1;
  split(nod, st, mij, dr, f1, f2);
  if (x <= mij) query(f1, st, mij, x, y);
  if (mij < y) query(f2, mij + 1, dr, x, y);
}
int main() {
  read();
  for (long long i = 1; i <= Q; i++) {
    if (type[i] == 1) {
      currTimes.insert(t[i]);
      auto it = currTimes.find(t[i]);
      it++;
      long long rgt = N;
      if (it != currTimes.end()) rgt = (*it) - 1;
      setValue(1, 1, N, t[i], rgt, s[i]);
      currentS[t[i]] = s[i];
      continue;
    }
    if (type[i] == 2) {
      auto it = currTimes.find(t[i]);
      long long s = 0;
      if (it != currTimes.begin()) {
        auto it2 = it;
        it2--;
        s = currentS[*it2];
      }
      it++;
      long long rgt = N;
      if (it != currTimes.end()) rgt = (*it) - 1;
      setValue(1, 1, N, t[i], rgt, s);
      currTimes.erase(t[i]), currentS[t[i]] = 0;
      continue;
    }
    ansQ = -1.0;
    if (v[i] == 0) {
      printf("%I64d\n", ts[l[i] - 1]);
      continue;
    }
    if (l[i] != r[i]) {
      auto it = currTimes.lower_bound(l[i]);
      if (it != currTimes.end() && (*it) < r[i])
        curr = v[i], query(1, 1, N, *it, r[i] - 1);
    }
    assert(ansQ <= ts[r[i] - 1] + eps);
    cout << setprecision(15) << ansQ << '\n';
  }
  return 0;
}
