#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;   }