#include <bits/stdc++.h>
using namespace std;
struct node {
  int count;
  void merge(struct node &l, struct node &r) { count = l.count + r.count; }
};
struct node query(struct node *st, int ss, int se, int qs, int qe, int si) {
  struct node result;
  if (qs <= ss && se <= qe) return st[si];
  int mid = ss + (se - ss) / 2;
  if (qs > mid) return query(st, mid + 1, se, qs, qe, 2 * si + 2);
  if (qe <= mid) return query(st, ss, mid, qs, qe, 2 * si + 1);
  struct node l = query(st, ss, mid, qs, qe, 2 * si + 1);
  struct node r = query(st, mid + 1, se, qs, qe, 2 * si + 2);
  result.merge(l, r);
  return result;
}
void constructUtil(int a[], struct node *st, int ss, int se, int si, int k) {
  if (ss == se) {
    if (a[ss] >= k)
      st[si].count = 1;
    else
      st[si].count = 0;
    return;
  }
  int mid = ss + (se - ss) / 2;
  constructUtil(a, st, ss, mid, 2 * si + 1, k);
  constructUtil(a, st, mid + 1, se, 2 * si + 2, k);
  st[si].merge(st[2 * si + 1], st[2 * si + 2]);
}
struct node *construct(int a[], int n, int k) {
  int x = (int)(ceil(log2(n)));
  int size = 2 * pow(2, x) - 1;
  struct node *st = new struct node[size];
  constructUtil(a, st, 0, n - 1, 0, k);
  return st;
}
int main() {
  int n, k, q;
  cin >> n >> k >> q;
  int a[200010] = {0};
  for (int l, r, i = 0; i < n; i++) {
    scanf("%d", &l);
    scanf("%d", &r);
    a[l]++, a[r + 1]--;
  }
  for (int i = 0; i < 200010; i++)
    if (i) a[i] += a[i - 1];
  struct node *st = construct(a, 200010, k);
  while (q--) {
    int i, j;
    scanf("%d", &i);
    scanf("%d", &j);
    printf("%d\n", query(st, 0, 200010 - 1, i, j, 0).count);
  }
  return 0;
}
