#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 7;
const long long linf = 1ll << 60;
const double dinf = 1e60;
template <typename T>
inline void scf(T &x) {
  bool f = 0;
  x = 0;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') {
    f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  if (f) x = -x;
  return;
}
template <typename T1, typename T2>
void scf(T1 &x, T2 &y) {
  scf(x);
  return scf(y);
}
template <typename T1, typename T2, typename T3>
void scf(T1 &x, T2 &y, T3 &z) {
  scf(x);
  scf(y);
  return scf(z);
}
template <typename T1, typename T2, typename T3, typename T4>
void scf(T1 &x, T2 &y, T3 &z, T4 &w) {
  scf(x);
  scf(y);
  scf(z);
  return scf(w);
}
inline char mygetchar() {
  char c = getchar();
  while (c == ' ' || c == '\n') c = getchar();
  return c;
}
template <typename T>
void chkmax(T &x, const T &y) {
  if (y > x) x = y;
  return;
}
template <typename T>
void chkmin(T &x, const T &y) {
  if (y < x) x = y;
  return;
}
void TZL();
void RANK1();
int main() {
  TZL();
  RANK1();
  return 0;
}
const int N = 1e5 + 100;
const int B = 350;
int n, q_n;
int lb[N], rb[N];
int bel[N], ans[N];
int l[N], r[N];
int fst[N], lst[N];
int stk[N], top;
int dp[N];
vector<int> has[N];
void BF(int i) {
  int l = ::l[i], r = ::r[i], &ans = ::ans[i];
  ans = l;
  for (int j = (l), _end_ = (r); j <= _end_; ++j)
    if (lb[j] >= l && ans >= lb[j]) ans = j;
  return;
}
void TZL() {
  scf(n);
  for (int i = (1), _end_ = (n); i <= _end_; ++i)
    lb[i] = i, bel[i] = (i - 1) / B;
  for (int i = (1), _end_ = (n); i <= _end_; ++i) lst[bel[i]] = i;
  for (int i = (n), _end_ = (1); i >= _end_; --i) fst[bel[i]] = i;
  int e_n;
  scf(e_n);
  for (int i = 0, _end_ = (e_n); i < _end_; ++i) {
    int u, v;
    scf(u, v);
    lb[v] = u;
  }
  scf(q_n);
  for (int i = (1), _end_ = (q_n); i <= _end_; ++i) {
    scf(l[i], r[i]);
    if (r[i] - l[i] + 1 <= B)
      BF(i);
    else
      has[bel[r[i]]].push_back(i);
  }
  return;
}
void RANK1() {
  for (int _ = (0), _end_ = (bel[n - 1]); _ <= _end_; ++_)
    if ((int)has[_].size()) {
      auto &has = ::has[_];
      int q = fst[_];
      for (int p = (1), _end_ = (q); p <= _end_; ++p) rb[p] = p;
      for (int p = (1), _end_ = (q); p <= _end_; ++p) rb[lb[p]] = p;
      top = 0;
      for (int p = (q), _end_ = (1); p >= _end_; --p) {
        int mx = p;
        while (top && stk[top - 1] <= rb[p]) chkmax(mx, dp[stk[--top]]);
        dp[p] = mx;
        while (top && dp[stk[top - 1]] <= dp[p]) --top;
        stk[top++] = p;
      }
      for (int i : has) {
        int l = ::l[i], r = ::r[i], &ans = ::ans[i];
        ans = dp[l];
        for (int j = (q + 1), _end_ = (r); j <= _end_; ++j)
          if (lb[j] >= l && lb[j] <= ans) ans = j;
      }
    }
  for (int i = (1), _end_ = (q_n); i <= _end_; ++i) printf("%d\n", ans[i]);
  return;
}
