#include <bits/stdc++.h>
int c[1005];
bool f(int x1, int y1, int x2, int y2) {
  if ((x1 > x2 && y1 > y2 && x1 > y2) || (x1 < x2 && y1 < y2 && y1 < x2))
    return 0;
  return 1;
}
struct node {
  int s, e;
} a[55], b[55];
int main() {
  int p, q, l, r, i, j, k;
  while (~scanf("%d%d%d%d", &p, &q, &l, &r)) {
    memset(c, 0, sizeof(c));
    for (i = 0; i < p; i++) scanf("%d%d", &a[i].s, &a[i].e);
    for (i = 0; i < q; i++) scanf("%d%d", &b[i].s, &b[i].e);
    int num = 0;
    for (i = 0; i < q; i++) {
      for (j = 0; j < p; j++) {
        for (k = l; k <= r; k++) {
          if (k == l && f(b[i].s + l, b[i].e + r, a[j].s, a[j].e) == 0) break;
          if (f(b[i].s + k, b[i].e + k, a[j].s, a[j].e) && c[k] == 0) {
            c[k] = 1;
            num++;
          }
        }
      }
    }
    printf("%d\n", num);
  }
  return 0;
}
