Problem p00714 (C++) — buggy submission, verdict: Runtime Error

#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;
using ld = long double;
template <class T> using Table = vector<vector<T>>;

const double eps = 1e-9, pi = acos(-1.0);
//
// int main() {
//	int N, A, B, T; cin >> N >> A >> B >> T;
//	string st; cin >> st;
//	vector<long long int>times(st.size(),1);
//	for (int i = 0; i < st.size(); ++i) {
//		if (st[i] == 'w') {
//			times[i] += B;
//		}
//	}
//	if (times[0] > T) {
//		cout << 0 << endl;
//		return 0;
//	}
//	else {
//		T -= times[0];
//		{
//			if (accumulate(times.begin() + 1, times.end(), A*(N-1)) <=
//T) { 				cout << N << endl; 				return 0;
//			}
//			else {
//				vector<int>rdp,ldp;
//				{
//					rdp.push_back(0);
//					int ntime = 0;
//					for (int i = 1; i < N; ++i) {
//						ntime += A + times[i];
//						rdp.push_back(ntime);
//					}
//				}
//				{
//					ldp.push_back(0);
//					int ntime = 0;
//					for (int i = N-1; i >=1; --i) {
//						ntime += A + times[i];
//						ldp.push_back(ntime);
//					}
//				}
//				int ans = 1;
//				for (int i = 0; i < N; ++i) {
//					int resttime = T - rdp[i]-A*i;
//					if (rdp[i] > T)break;
//					auto it = lower_bound(ldp.begin(), ldp.end(),
//resttime); 					ans = max(ans, i+(it - ldp.begin()));
//				}
//				cout << ans << endl;
//			}
//		}
//	}
//	return 0;
//}
struct aqua {
  int lh;
  int rh;
  int x;
  ld pluswater;
  ld high;
  vector<int> places;
  aqua(const int _lh, const int rh_, const int x_)
      : lh(_lh), rh(rh_), x(x_), pluswater(0), high(0), places(){};
};

struct check {
  int id;
  int time;
  int place;
};
int main() {
  int D;
  cin >> D;
  while (D--) {
    int N;
    cin >> N;
    vector<pair<int, int>> plates;
    vector<aqua> aquas;
    for (int i = 0; i < N; ++i) {
      int B, H;
      cin >> B >> H;
      plates.emplace_back(B, H);
    }
    aquas.emplace_back(1e9, plates[0].second, plates[0].first);
    aquas[0].places.push_back(0);
    for (int i = 0; i < N - 1; ++i) {
      aquas.emplace_back(plates[i].second, plates[i + 1].second,
                         plates[i + 1].first - plates[i].first);
      aquas[i + 1].places.push_back(i + 1);
    }
    aquas.emplace_back(plates[N - 1].second, 1e9, 100 - plates[N - 1].first);
    aquas[N].places.push_back(N);
    int M;
    cin >> M;
    for (int i = 0; i < M; ++i) {
      int F, A;
      cin >> F >> A;
      auto it = lower_bound(plates.begin(), plates.end(), make_pair(F, 0));
      const int place = it - plates.begin();
      aquas[place].pluswater += A;
    }
    int L;
    cin >> L;
    vector<check> ps;
    for (int i = 0; i < L; i++) {
      int P, T;
      cin >> P >> T;
      auto it = lower_bound(plates.begin(), plates.end(), make_pair(P, 0));
      const int place = it - plates.begin();
      ps.push_back(check{i, T, place});
    }
    sort(ps.begin(), ps.end(),
         [](const check &l, const check &r) { return l.time < r.time; });
    auto it = ps.begin();
    vector<ld> anss(L);
    ld nowtime = 0;
    while (it != ps.end()) {
      vector<ld> uptimes;
      for (int i = 0; i < aquas.size(); ++i) {
        if (aquas[i].pluswater < 1e-10)
          uptimes.push_back(1e18);
        else {
          const ld restheight = min(aquas[i].lh, aquas[i].rh) - aquas[i].high;
          uptimes.push_back(nowtime +
                            restheight * 30 * aquas[i].x / aquas[i].pluswater);
        }
      }
      ld nexttime = *min_element(uptimes.begin(), uptimes.end());
      for (int i = 0; i < aquas.size(); ++i) {
        aquas[i].high +=
            (nexttime - nowtime) * aquas[i].pluswater / 30 / aquas[i].x;
      }
      while (nexttime > it->time + eps) {
        for (int i = 0; i < aquas.size(); ++i) {
          if (find(aquas[i].places.begin(), aquas[i].places.end(), it->place) !=
              aquas[i].places.end()) {
            anss[it->id] = aquas[i].high - (nexttime - it->time) *
                                               aquas[i].pluswater / 30 /
                                               aquas[i].x;
          }
        }
        it++;
        if (it == ps.end())
          break;
      }
      for (int j = 0; j < 20; ++j) {
        for (int i = 0; i < aquas.size(); ++i) {
          if (aquas[i].high + eps > aquas[i].rh) {
            if (i == aquas.size() - 1)
              continue;
            if (abs(aquas[i].high - aquas[i + 1].high) < eps) {
              aquas[i].rh = aquas[i + 1].rh;
              aquas[i].pluswater += aquas[i + 1].pluswater;
              aquas[i].x += aquas[i + 1].x;
              aquas[i].places.insert(aquas[i].places.end(),
                                     aquas[i + 1].places.begin(),
                                     aquas[i + 1].places.end());
              aquas.erase(aquas.begin() + i + 1);
              break;
            } else {
              aquas[i + 1].pluswater += aquas[i].pluswater;
              aquas[i].pluswater = 0;
            }
          }
          if (aquas[i].high + eps > aquas[i].lh) {
            if (!i)
              continue;
            if (abs(aquas[i].high - aquas[i - 1].high) < eps) {
              aquas[i].lh = aquas[i - 1].lh;
              aquas[i].pluswater += aquas[i - 1].pluswater;
              aquas[i].x += aquas[i - 1].x;
              aquas[i].places.insert(aquas[i].places.end(),
                                     aquas[i - 1].places.begin(),
                                     aquas[i - 1].places.end());
              aquas.erase(aquas.begin() + i - 1);
              break;
            } else {
              aquas[i - 1].pluswater += aquas[i].pluswater;
              aquas[i].pluswater = 0;
            }
          }
        }
      }
      nowtime = nexttime;
    }

    for (int i = 0; i < anss.size(); i++) {
      cout << fixed << setprecision(22) << min(50.l, anss[i]) << endl;
    }
  }
  return 0;
}

Error: WA

Fixed submission:

#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;
using ld = long double;
template <class T> using Table = vector<vector<T>>;

const double eps = 1e-9, pi = acos(-1.0);
//
// int main() {
//	int N, A, B, T; cin >> N >> A >> B >> T;
//	string st; cin >> st;
//	vector<long long int>times(st.size(),1);
//	for (int i = 0; i < st.size(); ++i) {
//		if (st[i] == 'w') {
//			times[i] += B;
//		}
//	}
//	if (times[0] > T) {
//		cout << 0 << endl;
//		return 0;
//	}
//	else {
//		T -= times[0];
//		{
//			if (accumulate(times.begin() + 1, times.end(), A*(N-1)) <=
//T) { 				cout << N << endl; 				return 0;
//			}
//			else {
//				vector<int>rdp,ldp;
//				{
//					rdp.push_back(0);
//					int ntime = 0;
//					for (int i = 1; i < N; ++i) {
//						ntime += A + times[i];
//						rdp.push_back(ntime);
//					}
//				}
//				{
//					ldp.push_back(0);
//					int ntime = 0;
//					for (int i = N-1; i >=1; --i) {
//						ntime += A + times[i];
//						ldp.push_back(ntime);
//					}
//				}
//				int ans = 1;
//				for (int i = 0; i < N; ++i) {
//					int resttime = T - rdp[i]-A*i;
//					if (rdp[i] > T)break;
//					auto it = lower_bound(ldp.begin(), ldp.end(),
//resttime); 					ans = max(ans, i+(it - ldp.begin()));
//				}
//				cout << ans << endl;
//			}
//		}
//	}
//	return 0;
//}
struct aqua {
  int lh;
  int rh;
  int x;
  ld pluswater;
  ld high;
  vector<int> places;
  aqua(const int _lh, const int rh_, const int x_)
      : lh(_lh), rh(rh_), x(x_), pluswater(0), high(0), places(){};
};

struct check {
  int id;
  int time;
  int place;
};
int main() {
  int D;
  cin >> D;
  while (D--) {
    int N;
    cin >> N;
    vector<pair<int, int>> plates;
    vector<aqua> aquas;
    for (int i = 0; i < N; ++i) {
      int B, H;
      cin >> B >> H;
      plates.emplace_back(B, H);
    }
    aquas.emplace_back(1e9, plates[0].second, plates[0].first);
    aquas[0].places.push_back(0);
    for (int i = 0; i < N - 1; ++i) {
      aquas.emplace_back(plates[i].second, plates[i + 1].second,
                         plates[i + 1].first - plates[i].first);
      aquas[i + 1].places.push_back(i + 1);
    }
    aquas.emplace_back(plates[N - 1].second, 1e9, 100 - plates[N - 1].first);
    aquas[N].places.push_back(N);
    int M;
    cin >> M;
    for (int i = 0; i < M; ++i) {
      int F, A;
      cin >> F >> A;
      auto it = lower_bound(plates.begin(), plates.end(), make_pair(F, 0));
      const int place = it - plates.begin();
      aquas[place].pluswater += A;
    }
    int L;
    cin >> L;
    vector<check> ps;
    for (int i = 0; i < L; i++) {
      int P, T;
      cin >> P >> T;
      auto it = lower_bound(plates.begin(), plates.end(), make_pair(P, 0));
      const int place = it - plates.begin();
      ps.push_back(check{i, T, place});
    }
    sort(ps.begin(), ps.end(),
         [](const check &l, const check &r) { return l.time < r.time; });
    auto it = ps.begin();
    vector<ld> anss(L);
    ld nowtime = 0;
    while (it != ps.end()) {
      vector<ld> uptimes;
      for (int i = 0; i < aquas.size(); ++i) {
        if (aquas[i].pluswater < 1e-10)
          uptimes.push_back(1e18);
        else {
          const ld restheight = min(aquas[i].lh, aquas[i].rh) - aquas[i].high;
          uptimes.push_back(nowtime +
                            restheight * 30 * aquas[i].x / aquas[i].pluswater);
        }
      }
      ld nexttime = *min_element(uptimes.begin(), uptimes.end());
      for (int i = 0; i < aquas.size(); ++i) {
        aquas[i].high +=
            (nexttime - nowtime) * aquas[i].pluswater / 30 / aquas[i].x;
      }
      while (nexttime > it->time + eps) {
        for (int i = 0; i < aquas.size(); ++i) {
          if (find(aquas[i].places.begin(), aquas[i].places.end(), it->place) !=
              aquas[i].places.end()) {
            anss[it->id] = aquas[i].high - (nexttime - it->time) *
                                               aquas[i].pluswater / 30 /
                                               aquas[i].x;
          }
        }
        it++;
        if (it == ps.end())
          break;
      }
      for (int j = 0; j < 20; ++j) {
        for (int i = 0; i < aquas.size(); ++i) {
          if (aquas[i].high + eps > aquas[i].rh) {
            if (abs(aquas[i].high - aquas[i + 1].high) < eps) {
              aquas[i].rh = aquas[i + 1].rh;
              aquas[i].pluswater += aquas[i + 1].pluswater;
              aquas[i].x += aquas[i + 1].x;
              aquas[i].places.insert(aquas[i].places.end(),
                                     aquas[i + 1].places.begin(),
                                     aquas[i + 1].places.end());
              aquas.erase(aquas.begin() + i + 1);
              break;
            } else {
              aquas[i + 1].pluswater += aquas[i].pluswater;
              aquas[i].pluswater = 0;
            }
          }
          if (aquas[i].high + eps > aquas[i].lh) {
            if (abs(aquas[i].high - aquas[i - 1].high) < eps) {
              aquas[i].lh = aquas[i - 1].lh;
              aquas[i].pluswater += aquas[i - 1].pluswater;
              aquas[i].x += aquas[i - 1].x;
              aquas[i].places.insert(aquas[i].places.end(),
                                     aquas[i - 1].places.begin(),
                                     aquas[i - 1].places.end());
              aquas.erase(aquas.begin() + i - 1);
              break;
            } else {
              aquas[i - 1].pluswater += aquas[i].pluswater;
              aquas[i].pluswater = 0;
            }
          }
        }
      }
      nowtime = nexttime;
    }

    for (int i = 0; i < anss.size(); i++) {
      cout << fixed << setprecision(22) << min(50.l, anss[i]) << endl;
    }
  }
  return 0;
}