#include <bits/stdc++.h>
const int N = 100005;
const int inf = 2e9;
using namespace std;
int n, m, pos[N], ans[N];
struct Query {
  int l, r, id;
  bool operator<(const Query &x) const { return r < x.r; }
} q[N];
inline int read() {
  int f = 1, x = 0;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1;
  } while (ch < '0' || ch > '9');
  do {
    x = x * 10 + ch - '0';
    ch = getchar();
  } while (ch >= '0' && ch <= '9');
  return f * x;
}
struct Segment_Tree_Beats {
  int maxv[N << 2], tag[N << 2], cntv[N << 2], secv[N << 2];
  inline void puttag(int o, int a, int b) {
    if (maxv[o] >= a) {
      maxv[o] = b;
      tag[o] = b;
      if (!cntv[o]) cntv[o] = a;
    }
  }
  inline void calc(int &x, int &y, int &z) {
    if (z > x)
      y = x, x = z;
    else if (z < x && z > y)
      y = z;
  }
  inline void pushup(int o) {
    maxv[o] = secv[o] = -1 << 30;
    calc(maxv[o], secv[o], maxv[(o << 1)]);
    calc(maxv[o], secv[o], secv[(o << 1)]);
    calc(maxv[o], secv[o], maxv[(o << 1 | 1)]);
    calc(maxv[o], secv[o], secv[(o << 1 | 1)]);
  }
  inline void pushdown(int o) {
    if (!tag[o]) return;
    puttag((o << 1), cntv[o], tag[o]);
    puttag((o << 1 | 1), cntv[o], tag[o]);
    tag[o] = 0;
    cntv[o] = 0;
  }
  inline void build(int o, int l, int r) {
    if (l == r) {
      maxv[o] = l;
      secv[o] = -1 << 30;
      return;
    }
    int mid = (l + r) >> 1;
    build((o << 1), l, mid);
    build((o << 1 | 1), mid + 1, r);
    pushup(o);
  }
  inline void change(int o, int l, int r, int ql, int qr, int a, int b) {
    if (maxv[o] < a) return;
    if (ql <= l && r <= qr && secv[o] < a) {
      puttag(o, a, b);
      return;
    }
    pushdown(o);
    int mid = (l + r) >> 1;
    if (ql <= mid) change((o << 1), l, mid, ql, qr, a, b);
    if (qr > mid) change((o << 1 | 1), mid + 1, r, ql, qr, a, b);
    pushup(o);
  }
  inline int query(int o, int l, int r, int q) {
    if (l == r) return maxv[o];
    pushdown(o);
    int mid = (l + r) >> 1;
    if (q <= mid)
      return query((o << 1), l, mid, q);
    else
      return query((o << 1 | 1), mid + 1, r, q);
  }
} T;
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= m; i++) {
    int l = read(), r = read();
    pos[r] = l;
  }
  int Q = read();
  for (int i = 1; i <= Q; i++) {
    q[i].l = read();
    q[i].r = read();
    q[i].id = i;
  }
  sort(q + 1, q + Q + 1);
  T.build(1, 1, n);
  int cur = 1;
  for (int i = 1; i <= n; i++) {
    if (pos[i]) T.change(1, 1, n, 1, pos[i], pos[i], i);
    for (; cur <= Q && q[cur].r == i; cur++)
      ans[q[cur].id] = T.query(1, 1, n, q[cur].l);
  }
  for (int i = 1; i <= Q; i++) printf("%d\n", ans[i]);
}
