Problem p02680 (C++) — buggy submission, verdict: Time Limit Exceeded

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define ALL(obj) (obj).begin(), (obj).end()
template <class T>
using priority_queue_reverse = priority_queue<T, vector<T>, greater<T>>;

constexpr long long MOD = 1'000'000'000LL + 7; //'
constexpr long long MOD2 = 998244353;
constexpr long long HIGHINF = (long long)1e18;
constexpr long long LOWINF = (long long)1e11;
constexpr long double PI = 3.1415926535897932384626433L;

template <class T> vector<T> multivector(size_t N, T init) {
  return vector<T>(N, init);
}
template <class... T> auto multivector(size_t N, T... t) {
  return vector<decltype(multivector(t...))>(N, multivector(t...));
}
template <class T> void corner(bool flg, T hoge) {
  if (flg) {
    cout << hoge << endl;
    exit(0);
  }
}
template <class T, class U>
ostream &operator<<(ostream &o, const map<T, U> &obj) {
  o << "{";
  for (auto &x : obj)
    o << " {" << x.first << " : " << x.second << "}"
      << ",";
  o << " }";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const set<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const multiset<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const vector<T> &obj) {
  o << "{";
  for (int i = 0; i < (int)obj.size(); ++i)
    o << (i > 0 ? ", " : "") << obj[i];
  o << "}";
  return o;
}
template <class T, class U>
ostream &operator<<(ostream &o, const pair<T, U> &obj) {
  o << "{" << obj.first << ", " << obj.second << "}";
  return o;
}
void print(void) { cout << endl; }
template <class Head> void print(Head &&head) {
  cout << head;
  print();
}
template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) {
  cout << head << " ";
  print(forward<Tail>(tail)...);
}
template <class T> void chmax(T &a, const T b) { a = max(a, b); }
template <class T> void chmin(T &a, const T b) { a = min(a, b); }
vector<string> split(const string &str, const char delemiter) {
  vector<string> res;
  stringstream ss(str);
  string buffer;
  while (getline(ss, buffer, delemiter))
    res.push_back(buffer);
  return res;
}
int msb(int x) { return x ? 31 - __builtin_clz(x) : -1; }
void YN(bool flg) { cout << (flg ? "YES" : "NO") << endl; }
void Yn(bool flg) { cout << (flg ? "Yes" : "No") << endl; }
void yn(bool flg) { cout << (flg ? "yes" : "no") << endl; }

// Seat Pressure O(NlogN)
template <class T> class Zarts {
public:
  vector<T> val;
  map<T, int> idx;
  int M;
  Zarts(const vector<T> &ar) : M(0) {
    for (auto &e : ar)
      idx[e] = 0;
    for (auto &e : idx)
      e.second = M++;
    val.resize(M);
    for (auto &e : idx)
      val[e.second] = e.first;
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int N, M;
  cin >> N >> M;
  vector<ll> X(N + 2 * M + 3), Y(2 * N + M + 3);
  for (int i = 0; i < N; ++i) {
    int A, B, C;
    cin >> A >> B >> C;
    Y[2 * i] = A;
    Y[2 * i + 1] = B;
    X[i] = C;
  }
  for (int i = 0; i < M; ++i) {
    int D, E, F;
    cin >> D >> E >> F;
    Y[2 * N + i] = D;
    X[N + 2 * i] = E;
    X[N + 2 * i + 1] = F;
  }
  Y[2 * N + M] = X[N + 2 * M] = 0;
  Y[2 * N + M + 1] = X[N + 2 * M + 1] = -LOWINF;
  Y[2 * N + M + 2] = X[N + 2 * M + 2] = LOWINF;
  Zarts<ll> ZY(Y), ZX(X);
  int H = ZY.M, W = ZX.M;

  // y1,y2,x;
  vector<set<pair<int, int>>> stx(W);
  for (int i = 0; i < N; ++i) {
    ll y1 = Y[2 * i], y2 = Y[2 * i + 1], x = X[i];
    int zy1 = ZY.idx[y1], zy2 = ZY.idx[y2], zx = ZX.idx[x];
    for (int j = zy1; j + 1 <= zy2; ++j) {
      stx[zx].insert({j, j + 1});
    }
  }
  // y,x1,x2;
  vector<set<pair<int, int>>> sty(H);
  for (int i = 0; i < M; ++i) {
    ll y = Y[2 * N + i], x1 = X[N + 2 * i], x2 = X[N + 2 * i + 1];
    int zy = ZY.idx[y], zx1 = ZX.idx[x1], zx2 = ZX.idx[x2];
    for (int j = zx1; j + 1 <= zx2; ++j) {
      sty[zy].insert({j, j + 1});
    }
  }
  vector<ll> grid(H * W, 0);
  vector<vector<int>> edge(H * W);
  for (int i = 0; i + 1 < H; ++i) {
    for (int j = 0; j + 1 < W; ++j) {
      ll dy = ZY.val[i + 1] - ZY.val[i];
      ll dx = ZX.val[j + 1] - ZX.val[j];
      ll s = -1;
      if (dy < 1e10 && dx < 1e10)
        s = dy * dx;
      grid[i * W + j] = s;
      if (!stx[j + 1].count({i, i + 1})) {
        int from = i * W + j, to = i * W + j + 1;
        edge[from].push_back(to);
        edge[to].push_back(from);
      }
      if (!sty[i + 1].count({j, j + 1})) {
        int from = i * W + j, to = (i + 1) * W + j;
        edge[from].push_back(to);
        edge[to].push_back(from);
      }
    }
  }
  int sy = ZY.idx[0], sx = ZX.idx[0];
  queue<int> q;
  q.push(sy * W + sx);
  ll sum = 0;
  sum += grid[sy * W + sx];
  grid[sy * W + sx] = 0;
  while (q.size()) {
    int from = q.front();
    q.pop();
    for (int to : edge[from]) {
      int ny = to / W, nx = to % W;
      if (grid[ny * W + nx] == 0)
        continue;
      corner(grid[ny * W + nx] == -1, "INF");
      sum += grid[ny * W + nx];
      grid[ny * W + nx] = 0;
      q.push(to);
    }
  }
  cout << sum << endl;
  return 0;
}


Error: TLE

Fixed submission:

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define ALL(obj) (obj).begin(), (obj).end()
template <class T>
using priority_queue_reverse = priority_queue<T, vector<T>, greater<T>>;

constexpr long long MOD = 1'000'000'000LL + 7; //'
constexpr long long MOD2 = 998244353;
constexpr long long HIGHINF = (long long)1e18;
constexpr long long LOWINF = (long long)1e11;
constexpr long double PI = 3.1415926535897932384626433L;

template <class T> vector<T> multivector(size_t N, T init) {
  return vector<T>(N, init);
}
template <class... T> auto multivector(size_t N, T... t) {
  return vector<decltype(multivector(t...))>(N, multivector(t...));
}
template <class T> void corner(bool flg, T hoge) {
  if (flg) {
    cout << hoge << endl;
    exit(0);
  }
}
template <class T, class U>
ostream &operator<<(ostream &o, const map<T, U> &obj) {
  o << "{";
  for (auto &x : obj)
    o << " {" << x.first << " : " << x.second << "}"
      << ",";
  o << " }";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const set<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const multiset<T> &obj) {
  o << "{";
  for (auto itr = obj.begin(); itr != obj.end(); ++itr)
    o << (itr != obj.begin() ? ", " : "") << *itr;
  o << "}";
  return o;
}
template <class T> ostream &operator<<(ostream &o, const vector<T> &obj) {
  o << "{";
  for (int i = 0; i < (int)obj.size(); ++i)
    o << (i > 0 ? ", " : "") << obj[i];
  o << "}";
  return o;
}
template <class T, class U>
ostream &operator<<(ostream &o, const pair<T, U> &obj) {
  o << "{" << obj.first << ", " << obj.second << "}";
  return o;
}
void print(void) { cout << endl; }
template <class Head> void print(Head &&head) {
  cout << head;
  print();
}
template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) {
  cout << head << " ";
  print(forward<Tail>(tail)...);
}
template <class T> void chmax(T &a, const T b) { a = max(a, b); }
template <class T> void chmin(T &a, const T b) { a = min(a, b); }
vector<string> split(const string &str, const char delemiter) {
  vector<string> res;
  stringstream ss(str);
  string buffer;
  while (getline(ss, buffer, delemiter))
    res.push_back(buffer);
  return res;
}
int msb(int x) { return x ? 31 - __builtin_clz(x) : -1; }
void YN(bool flg) { cout << (flg ? "YES" : "NO") << endl; }
void Yn(bool flg) { cout << (flg ? "Yes" : "No") << endl; }
void yn(bool flg) { cout << (flg ? "yes" : "no") << endl; }

// Seat Pressure O(NlogN)
template <class T> class Zarts {
public:
  vector<T> val;
  map<T, int> idx;
  int M;
  Zarts(const vector<T> &ar) : M(0) {
    for (auto &e : ar)
      idx[e] = 0;
    for (auto &e : idx)
      e.second = M++;
    val.resize(M);
    for (auto &e : idx)
      val[e.second] = e.first;
  }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int N, M;
  cin >> N >> M;
  vector<ll> X, Y;
  for (int i = 0; i < N; ++i) {
    int A, B, C;
    cin >> A >> B >> C;
    Y.push_back(A);
    Y.push_back(B);
    X.push_back(C);
  }
  for (int i = 0; i < M; ++i) {
    int D, E, F;
    cin >> D >> E >> F;
    Y.push_back(D);
    X.push_back(E);
    X.push_back(F);
  }
  Y.push_back(0);
  X.push_back(0);
  Y.push_back(-LOWINF);
  Y.push_back(LOWINF);
  X.push_back(-LOWINF);
  X.push_back(LOWINF);
  Zarts<ll> ZY(Y), ZX(X);
  int H = ZY.M, W = ZX.M;

  // y1,y2,x;
  vector<set<pair<int, int>>> stx(W);
  for (int i = 0; i < N; ++i) {
    ll y1 = Y[2 * i], y2 = Y[2 * i + 1], x = X[i];
    int zy1 = ZY.idx[y1], zy2 = ZY.idx[y2], zx = ZX.idx[x];
    for (int j = zy1; j + 1 <= zy2; ++j) {
      stx[zx].insert({j, j + 1});
    }
  }
  // y,x1,x2;
  vector<set<pair<int, int>>> sty(H);
  for (int i = 0; i < M; ++i) {
    ll y = Y[2 * N + i], x1 = X[N + 2 * i], x2 = X[N + 2 * i + 1];
    int zy = ZY.idx[y], zx1 = ZX.idx[x1], zx2 = ZX.idx[x2];
    for (int j = zx1; j + 1 <= zx2; ++j) {
      sty[zy].insert({j, j + 1});
    }
  }
  vector<ll> grid(H * W, 0);
  vector<vector<int>> edge(H * W);
  for (int i = 0; i + 1 < H; ++i) {
    for (int j = 0; j + 1 < W; ++j) {
      ll dy = ZY.val[i + 1] - ZY.val[i];
      ll dx = ZX.val[j + 1] - ZX.val[j];
      ll s = -1;
      if (dy < 1e10 && dx < 1e10)
        s = dy * dx;
      grid[i * W + j] = s;
      if (!stx[j + 1].count({i, i + 1})) {
        int from = i * W + j, to = i * W + j + 1;
        edge[from].push_back(to);
        edge[to].push_back(from);
      }
      if (!sty[i + 1].count({j, j + 1})) {
        int from = i * W + j, to = (i + 1) * W + j;
        edge[from].push_back(to);
        edge[to].push_back(from);
      }
    }
  }
  int sy = ZY.idx[0], sx = ZX.idx[0];
  queue<int> q;
  q.push(sy * W + sx);
  ll sum = 0;
  sum += grid[sy * W + sx];
  grid[sy * W + sx] = 0;
  while (q.size()) {
    int from = q.front();
    q.pop();
    for (int to : edge[from]) {
      int ny = to / W, nx = to % W;
      if (grid[ny * W + nx] == 0)
        continue;
      corner(grid[ny * W + nx] == -1, "INF");
      sum += grid[ny * W + nx];
      grid[ny * W + nx] = 0;
      q.push(to);
    }
  }
  cout << sum << endl;
  return 0;
}