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

#include <bits/stdc++.h>
using namespace std;
using lint = long long;
const lint inf = 1LL << 60;
const lint mod = 1000000007;

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  lint n, m;
  cin >> n >> m;
  vector<lint> a(n), b(n), c(n);
  vector<lint> d(m), e(m), f(m);
  map<lint, lint> xs, ys;
  set<lint> usedx, usedy;
  usedx.insert(-1000000010);
  usedx.insert(0);
  usedx.insert(1000000010);
  usedy.insert(-1000000010);
  usedy.insert(0);
  usedy.insert(1000000010);
  xs[-1000000010] = 0;
  xs[0] = 0;
  xs[1000000010] = 0;
  ys[-1000000010] = 0;
  ys[0] = 0;
  ys[1000000010] = 0;
  for (int i = 0; i < n; ++i) {
    cin >> a[i] >> b[i] >> c[i];
    xs[a[i]] = 0;
    xs[b[i]] = 0;
    ys[c[i]] = 0;
    usedx.insert(a[i]);
    usedx.insert(b[i]);
    usedy.insert(c[i]);
  }
  for (int i = 0; i < m; ++i) {
    cin >> d[i] >> e[i] >> f[i];
    xs[d[i]] = 0;
    ys[e[i]] = 0;
    ys[f[i]] = 0;
    usedx.insert(d[i]);
    usedy.insert(e[i]);
    usedy.insert(f[i]);
  }
  int xidx = 0;
  for (auto &p : xs) {
    p.second = xidx++;
  }
  int yidx = 0;
  for (auto &p : ys) {
    p.second = yidx++;
  }
  vector<vector<lint>> area(xidx + 5, vector<lint>(yidx + 5, 0));
  for (auto itx = next(usedx.begin()); itx != prev(usedx.end());
       itx = next(itx)) {
    int ix = xs[*itx];
    for (auto ity = next(usedy.begin()); ity != prev(usedy.end());
         ity = next(ity)) {
      int iy = ys[*ity];
      area[ix][iy] = (*next(itx) - *itx) * (*next(ity) - *ity);
    }
  }
  vector<vector<vector<bool>>> blc(
      xidx + 5, vector<vector<bool>>(yidx + 5, vector<bool>(5, false)));
  for (int i = 0; i < n; ++i) {
    // u, d
    int y = ys[c[i]];
    for (int j = xs[a[i]]; j < xs[b[i]]; ++j) {
      blc[j][y - 1][0] = true;
      blc[j][y][1] = true;
    }
  }
  for (int i = 0; i < m; ++i) {
    // l, r
    int x = xs[d[i]];
    for (int j = ys[e[i]]; j < ys[f[i]]; ++j) {
      blc[x][j][2] = true;
      blc[x - 1][j][3] = true;
    }
  }
  vector<vector<lint>> visited(xidx + 5, vector<lint>(yidx + 5, 0));
  queue<pair<int, int>> q;
  q.push({xs[0], ys[0]});
  visited[xs[0]][ys[0]] = 1;
  lint ret = area[xs[0]][ys[0]];
  while (!q.empty()) {
    auto p = q.front();
    q.pop();
    if (!blc[p.first][p.second][0] && visited[p.first][p.second + 1] == 0) {
      if (p.second == yidx - 3) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first][p.second + 1];
      visited[p.first][p.second + 1] = 1;
      q.push({p.first, p.second + 1});
    }
    if (!blc[p.first][p.second][1] && visited[p.first][p.second - 1] == 0) {
      if (p.second == 1) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first][p.second - 1];
      visited[p.first][p.second - 1] = 1;
      q.push({p.first, p.second - 1});
    }
    if (!blc[p.first][p.second][2] && visited[p.first - 1][p.second] == 0) {
      if (p.first == 1) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first - 1][p.second];
      visited[p.first - 1][p.second] = 1;
      q.push({p.first - 1, p.second});
    }
    if (!blc[p.first][p.second][3] && visited[p.first + 1][p.second] == 0) {
      if (p.first == xidx - 3) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first + 1][p.second];
      visited[p.first + 1][p.second] = 1;
      q.push({p.first + 1, p.second});
    }
  }
  cout << ret << "\\n";
  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using lint = long long;
const lint inf = 1LL << 60;
const lint mod = 1000000007;

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  lint n, m;
  cin >> n >> m;
  vector<lint> a(n), b(n), c(n);
  vector<lint> d(m), e(m), f(m);
  map<lint, lint> xs, ys;
  set<lint> usedx, usedy;
  usedx.insert(-1000000010);
  usedx.insert(0);
  usedx.insert(1000000010);
  usedy.insert(-1000000010);
  usedy.insert(0);
  usedy.insert(1000000010);
  xs[-1000000010] = 0;
  xs[0] = 0;
  xs[1000000010] = 0;
  ys[-1000000010] = 0;
  ys[0] = 0;
  ys[1000000010] = 0;
  for (int i = 0; i < n; ++i) {
    cin >> a[i] >> b[i] >> c[i];
    xs[a[i]] = 0;
    xs[b[i]] = 0;
    ys[c[i]] = 0;
    usedx.insert(a[i]);
    usedx.insert(b[i]);
    usedy.insert(c[i]);
  }
  for (int i = 0; i < m; ++i) {
    cin >> d[i] >> e[i] >> f[i];
    xs[d[i]] = 0;
    ys[e[i]] = 0;
    ys[f[i]] = 0;
    usedx.insert(d[i]);
    usedy.insert(e[i]);
    usedy.insert(f[i]);
  }
  int xidx = 0;
  for (auto &p : xs) {
    p.second = xidx++;
  }
  int yidx = 0;
  for (auto &p : ys) {
    p.second = yidx++;
  }
  vector<vector<lint>> area(xidx, vector<lint>(yidx, 0));
  for (auto itx = next(usedx.begin()); itx != prev(usedx.end());
       itx = next(itx)) {
    int ix = xs[*itx];
    for (auto ity = next(usedy.begin()); ity != prev(usedy.end());
         ity = next(ity)) {
      int iy = ys[*ity];
      area[ix][iy] = (*next(itx) - *itx) * (*next(ity) - *ity);
    }
  }
  vector<vector<vector<bool>>> blc(
      xidx, vector<vector<bool>>(yidx, vector<bool>(4, false)));
  for (int i = 0; i < n; ++i) {
    // u, d
    int y = ys[c[i]];
    for (int j = xs[a[i]]; j < xs[b[i]]; ++j) {
      blc[j][y - 1][0] = true;
      blc[j][y][1] = true;
    }
  }
  for (int i = 0; i < m; ++i) {
    // l, r
    int x = xs[d[i]];
    for (int j = ys[e[i]]; j < ys[f[i]]; ++j) {
      blc[x][j][2] = true;
      blc[x - 1][j][3] = true;
    }
  }
  vector<vector<lint>> visited(xidx, vector<lint>(yidx, 0));
  queue<pair<int, int>> q;
  q.push({xs[0], ys[0]});
  visited[xs[0]][ys[0]] = 1;
  lint ret = area[xs[0]][ys[0]];
  while (!q.empty()) {
    auto p = q.front();
    q.pop();
    if (!blc[p.first][p.second][0] && visited[p.first][p.second + 1] == 0) {
      if (p.second == yidx - 3) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first][p.second + 1];
      visited[p.first][p.second + 1] = 1;
      q.push({p.first, p.second + 1});
    }
    if (!blc[p.first][p.second][1] && visited[p.first][p.second - 1] == 0) {
      if (p.second == 1) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first][p.second - 1];
      visited[p.first][p.second - 1] = 1;
      q.push({p.first, p.second - 1});
    }
    if (!blc[p.first][p.second][2] && visited[p.first - 1][p.second] == 0) {
      if (p.first == 1) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first - 1][p.second];
      visited[p.first - 1][p.second] = 1;
      q.push({p.first - 1, p.second});
    }
    if (!blc[p.first][p.second][3] && visited[p.first + 1][p.second] == 0) {
      if (p.first == xidx - 3) {
        cout << "INF"
             << "\\n";
        return 0;
      }
      ret += area[p.first + 1][p.second];
      visited[p.first + 1][p.second] = 1;
      q.push({p.first + 1, p.second});
    }
  }
  cout << ret << "\\n";
  return 0;
}