Problem p00475 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define foreach(it, c)                                                         \\
  for (__typeof__((c).begin()) it = (c).begin(); it != (c).end(); ++it)
#define rforeach(it, c)                                                        \\
  for (__typeof__((c).rbegin()) it = (c).rbegin(); it != (c).rend(); ++it)
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define CL(arr, val) memset(arr, val, sizeof(arr))
#define COPY(dest, src) memcpy(dest, src, sizeof(dest))
#define ten(n) ((long long)(1e##n))
#define bin(n) (1LL << (n))
#define erep(i, n) for (int i = 0; i <= (int)(n); ++i)
#define revrep(i, n) for (int i = (n); i >= 0; --i)

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

template <class T> void uniq(vector<T> &c) {
  sort(c.begin(), c.end());
  c.erase(unique(c.begin(), c.end()), c.end());
}

template <class T> string to_s(const T &a) {
  ostringstream os;
  os << a;
  return os.str();
}
template <class T> T to_T(const string &s) {
  istringstream is(s);
  T res;
  is >> res;
  return res;
}

template <class T, class U> ostream &operator<<(ostream &os, pair<T, U> &p) {
  os << "( " << p.first << ", " << p.second << " )";
  return os;
}

template <class T>
void print(T a, int n, const string &deli = " ", int br = 1) {
  for (int i = 0; i < n; ++i) {
    cout << a[i];
    if (i + 1 != n)
      cout << deli;
  }
  while (br--)
    cout << endl;
}
template <class T>
void print(const T &c, const string &deli = " ", int br = 1) {
  foreach (it, c) {
    cout << *it;
    if (++it != c.end())
      cout << deli;
    --it;
  }
  while (br--)
    cout << endl;
}
template <class T> void print2d(T a, int w, int h, int width = -1, int br = 1) {
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (width != -1)
        cout.width(width);
      cout << a[i][j] << ' ';
    }
    cout << endl;
  }
  while (br--)
    cout << endl;
}

template <class T> void input(T &a, int n) {
  for (int i = 0; i < n; ++i)
    cin >> a[i];
}
template <class T> void input(T *a, int n) {
  for (int i = 0; i < n; ++i)
    cin >> a[i];
}

void fix_precision(int n) {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(10);
}
void fast_io() {
  cin.tie(0);
  ios::sync_with_stdio(false);
}
#define trace(x) (cout << #x << ": " << (x) << endl)

bool valid(int x, int y, int w, int h) {
  return 0 <= x && x < w && 0 <= y && y < h;
}

typedef long long ll;
typedef pair<int, int> pint;

// y(v): v>^<  y(^): ^>v<
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};

const double PI = acos(-1.0);
const int mod = ten(9) + 7;

#define pb push_back

const int M = ten(5) + 100;
int n;
int x[M], y[M];
pint a[M], b[M];
int a_idx[M], b_idx[M];
int gao(int *p, int *q) {
  rep(i, 2) rep(j, 2) if (p[i] == q[j]) return ten(9);

  int pa[2], pb[2], qa[2], qb[2];
  rep(i, 2) {
    pa[i] = a[a_idx[p[i]]].first;
    pb[i] = b[b_idx[p[i]]].first;
    qa[i] = a[a_idx[q[i]]].first;
    qb[i] = b[b_idx[q[i]]].first;
  }

  int res = -1;
  rep(v, n) {
    int va = a[a_idx[v]].first;
    int vb = b[b_idx[v]].first;

    int pa_dis = max(abs(pa[0] - va), abs(pa[1] - va));
    int pb_dis = max(abs(pb[0] - vb), abs(pb[1] - vb));
    int p_dis = max(pa_dis, pb_dis);

    int qa_dis = max(abs(qa[0] - va), abs(qa[1] - va));
    int qb_dis = max(abs(qb[0] - vb), abs(qb[1] - vb));
    int q_dis = max(qa_dis, qb_dis);

    chmax(res, min(p_dis, q_dis));
  }
  return res;
}
int main() {
  scanf("%d", &n);
  rep(i, n) scanf("%d%d", x + i, y + i);

  rep(i, n) {
    a[i] = pint(x[i] + y[i], i);
    b[i] = pint(x[i] - y[i], i);
  }
  sort(a, a + n);
  sort(b, b + n);
  rep(i, n) {
    a_idx[a[i].second] = i;
    b_idx[b[i].second] = i;
  }

  int res = ten(9);
  int p[] = {a[0].second, b[0].second};
  int q[] = {a[n - 1].second, b[n - 1].second};
  chmin(res, gao(p, q));
  swap(p[1], q[1]);
  chmin(res, gao(p, q));
  cout << res << endl;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define foreach(it, c)                                                         \\
  for (__typeof__((c).begin()) it = (c).begin(); it != (c).end(); ++it)
#define rforeach(it, c)                                                        \\
  for (__typeof__((c).rbegin()) it = (c).rbegin(); it != (c).rend(); ++it)
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define CL(arr, val) memset(arr, val, sizeof(arr))
#define COPY(dest, src) memcpy(dest, src, sizeof(dest))
#define ten(n) ((long long)(1e##n))
#define bin(n) (1LL << (n))
#define erep(i, n) for (int i = 0; i <= (int)(n); ++i)
#define revrep(i, n) for (int i = (n); i >= 0; --i)

template <class T> void max_swap(T &a, const T &b) { a = max(a, b); }
template <class T> void min_swap(T &a, const T &b) { a = min(a, b); }

template <class T> void uniq(vector<T> &c) {
  sort(c.begin(), c.end());
  c.erase(unique(c.begin(), c.end()), c.end());
}

template <class T> string to_s(const T &a) {
  ostringstream os;
  os << a;
  return os.str();
}
template <class T> T to_T(const string &s) {
  istringstream is(s);
  T res;
  is >> res;
  return res;
}

template <class T, class U> ostream &operator<<(ostream &os, pair<T, U> &p) {
  os << "( " << p.first << ", " << p.second << " )";
  return os;
}

template <class T>
void print(T a, int n, const string &deli = " ", int br = 1) {
  for (int i = 0; i < n; ++i) {
    cout << a[i];
    if (i + 1 != n)
      cout << deli;
  }
  while (br--)
    cout << endl;
}
template <class T>
void print(const T &c, const string &deli = " ", int br = 1) {
  foreach (it, c) {
    cout << *it;
    if (++it != c.end())
      cout << deli;
    --it;
  }
  while (br--)
    cout << endl;
}
template <class T> void print2d(T a, int w, int h, int width = -1, int br = 1) {
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (width != -1)
        cout.width(width);
      cout << a[i][j] << ' ';
    }
    cout << endl;
  }
  while (br--)
    cout << endl;
}

template <class T> void input(T &a, int n) {
  for (int i = 0; i < n; ++i)
    cin >> a[i];
}
template <class T> void input(T *a, int n) {
  for (int i = 0; i < n; ++i)
    cin >> a[i];
}

void fix_precision(int n) {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(10);
}
void fast_io() {
  cin.tie(0);
  ios::sync_with_stdio(false);
}
#define trace(x) (cout << #x << ": " << (x) << endl)

bool valid(int x, int y, int w, int h) {
  return 0 <= x && x < w && 0 <= y && y < h;
}

typedef long long ll;
typedef pair<int, int> pint;

// y(v): v>^<  y(^): ^>v<
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};

const double PI = acos(-1.0);
const int mod = ten(9) + 7;

#define pb push_back

class UnionFind {
private:
  vector<int> data;
  int _groups;

public:
  int n;
  UnionFind(int n) : data(n, -1), n(n), _groups(n) {}

  void unite(int x, int y) {
    x = root(x), y = root(y);
    if (x != y) {
      --_groups;
      if (data[x] > data[y])
        swap(x, y);
      data[x] += data[y];
      data[y] = x;
    }
  }
  bool same(int x, int y) { return root(x) == root(y); }
  int root(int x) { return data[x] < 0 ? x : data[x] = root(data[x]); }
  int size(int x) { return -data[root(x)]; }
  int groups() const { return _groups; }
};
const int M = ten(5) + 100;
int n;
int x[M], y[M];
int dist(int i, int j) { return abs(x[i] - x[j]) + abs(y[i] - y[j]); }
int main() {
  scanf("%d", &n);
  rep(i, n) scanf("%d%d", x + i, y + i);

  int a[M], b[M];
  {
    pint _a[M], _b[M];
    rep(i, n) {
      _a[i] = pint(x[i] + y[i], i);
      _b[i] = pint(x[i] - y[i], i);
    }
    sort(_a, _a + n);
    sort(_b, _b + n);
    rep(i, n) {
      a[i] = _a[i].second;
      b[i] = _b[i].second;
    }
  }

  typedef pair<int, pint> P;
  priority_queue<P> qa, qb;
  qa.push(P(dist(a[0], a[n - 1]), pint(0, n - 1)));
  qb.push(P(dist(b[0], b[n - 1]), pint(0, n - 1)));
  set<pint> used_a, used_b;
  int e[M];
  fill(e, e + n, -1);
  UnionFind uf(n);
  for (;;) {
    priority_queue<P> &q = qa.top().first >= qb.top().first ? qa : qb;
    set<pint> &used = qa.top().first >= qb.top().first ? used_a : used_b;
    int *p = qa.top().first >= qb.top().first ? a : b;

    int dis = q.top().first;
    int l = q.top().second.first;
    int r = q.top().second.second;
    q.pop();

    int u = p[l], v = p[r];
    if (uf.same(u, v)) {
      cout << dis << endl;
      return 0;
    } else {
      if (e[u] != -1)
        uf.unite(v, e[u]);
      if (e[v] != -1)
        uf.unite(u, e[v]);

      e[u] = v, e[v] = u;
    }

    int ld[] = {0, 1}, rd[] = {-1, 0};
    rep(i, 2) {
      int nl = l + ld[i], nr = r + rd[i];
      pint range(nl, nr);
      if (!used.count(range)) {
        used.insert(range);
        q.push(P(dist(p[nl], p[nr]), range));
      }
    }
  }

  cout << "akan" << endl;
  return 1;
}