Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

The Maximum Number of Overlaps

Given a set of $N$ axis-aligned rectangular seals, find the number of overlapped seals on the region which has the maximum number of overlapped seals.

Input

The input is given in the following format.

$N$

$x1_1$ $y1_1$ $x2_1$ $y2_1$

$x1_2$ $y1_2$ $x2_2$ $y2_2$

:

$x1_N$ $y1_N$ $x2_N$ $y2_N$

($x1_i, y1_i$) and ($x2_i, y2_i$) are the coordinates of the top-left and the bottom-right corner of the $i$-th seal respectively.

Constraints

$ 1 \leq N \leq 100000 $

$ 0 \leq x1_i < x2_i \leq 1000 $

$ 0 \leq y1_i < y2_i \leq 1000 $

$ x1_i, y1_i, x2_i, y2_i$ are given in integers

Output

Print the maximum number of overlapped seals in a line.

Sample Input 1

2
0 0 3 2
2 1 4 3

Sample Output 1

2

Sample Input 2

2
0 0 2 2
2 0 4 2

Sample Output 2

1

Sample Input 3

3
0 0 2 2
0 0 2 2
0 0 2 2

Sample Output 3

3

Solution in C++14 (judge verdict: Time Limit Exceeded)

#include <algorithm>
#include <iostream>
#include <map>
#include <tuple>
#include <vector>
using namespace std;
using ll = long long;

struct seg {
  // [start, end)
  int x;
  int ylow;
  int yhi;
  int begin; // 1 for begin, -1 for end
  bool operator<(const seg &s) const { return x < s.x; }
};

struct interval {
  int ylow;
  int yhi;
  bool operator<(const interval &i) const { return ylow < i.ylow; }
};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);

  int n;
  cin >> n;

  vector<seg> rects;
  vector<int> ys;
  for (int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;) {
    rects.push_back({x1, y1, y2, 1});
    rects.push_back({x2, y1, y2, -1});
    ys.push_back(y1);
    ys.push_back(y2);
  }
  sort(ys.begin(), ys.end());
  ys.erase(unique(ys.begin(), ys.end()), ys.end());

  map<interval, int> counts;
  for (int i = 0; i < ys.size() - 1; ++i)
    counts[{ys[i], ys[i + 1]}] = 0;

  sort(rects.begin(), rects.end());
  int xlast = rects[0].x;
  interval i;
  int ct;
  int M = 0;
  for (auto it = rects.begin(); it != rects.end();) {
    // each iteration, process all segments at one xvalue
    while (it != rects.end() and it->x == xlast) {
      for (auto &kv : counts) {
        tie(i, ct) = kv;
        if (it->ylow <= i.ylow and it->yhi >= i.yhi) {
          counts[i] += it->begin;
        }
      }
      ++it;
    }
    // then check if the number of rectangles has changed
    for (auto &kv : counts) {
      tie(i, ct) = kv;
      M = max(M, ct);
    }
    xlast = it->x;
  }
  cout << M << endl;
}