#include <bits/stdc++.h>
using namespace std;
const int N = 1000000 + 5;
int n, m;
int p[N];
vector<int> graph[N];
int mark[N];
vector<pair<int, int> > u[N];
int ans[N];
const int INF = 1000000000;
int t[4 * N];
int ad[4 * N];
void build(int v, int tl, int tr) {
  ad[v] = INF;
  if (tl == tr) {
    t[v] = INF;
    return;
  }
  int tm = (tl + tr) / 2;
  build(v + v, tl, tm);
  build(v + v + 1, tm + 1, tr);
  t[v] = max(t[v + v], t[v + v + 1]);
}
void push(int v) {
  ad[v + v] = min(ad[v + v], ad[v]);
  t[v + v] = min(t[v + v], ad[v]);
  ad[v + v + 1] = min(ad[v + v + 1], ad[v]);
  t[v + v + 1] = min(t[v + v + 1], ad[v]);
}
void update(int v, int tl, int tr, int l, int r, int val) {
  if (l <= tl && tr <= r) {
    ad[v] = min(ad[v], val);
    t[v] = min(t[v], ad[v]);
    return;
  }
  push(v);
  int tm = (tl + tr) / 2;
  if (l <= tm) update(v + v, tl, tm, l, r, val);
  if (r > tm) update(v + v + 1, tm + 1, tr, l, r, val);
  t[v] = max(t[v + v], t[v + v + 1]);
}
int Y;
int get(int v, int tl, int tr, int l, int r) {
  int tm = (tl + tr) / 2;
  if (l == tl && tr == r) {
    if (t[v] <= Y) return INF;
    if (tl == tr) return tl;
    push(v);
    if (t[v + v] > Y)
      return get(v + v, tl, tm, tl, tm);
    else
      return get(v + v + 1, tm + 1, tr, tm + 1, tr);
  }
  push(v);
  if (r <= tm) return get(v + v, tl, tm, l, r);
  if (l > tm) return get(v + v + 1, tm + 1, tr, l, r);
  int in = get(v + v, tl, tm, l, tm);
  if (in != INF) return in;
  return get(v + v + 1, tm + 1, tr, tm + 1, r);
}
void solve() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= (int)(n); ++i) p[i] = i;
  for (int i = 1; i <= (int)(m); ++i) {
    int s, f;
    scanf("%d%d", &s, &f);
    p[f] = s;
  }
  for (int i = 1; i <= (int)(n); ++i)
    if (p[i] != i) graph[p[i]].push_back(i);
  int Q;
  scanf("%d", &Q);
  for (int iter = 1; iter <= (int)(Q); ++iter) {
    int x, y;
    scanf("%d%d", &x, &y);
    ans[iter] = x;
    u[x].push_back(make_pair(y, iter));
  }
  build(1, 1, n);
  for (int i = (int)(n); i >= 1; --i) {
    for (auto f : graph[i]) {
      update(1, 1, n, i, f - 1, f);
    }
    for (auto U : u[i]) {
      Y = U.first;
      int in = U.second;
      ans[in] = max(ans[in], min(get(1, 1, n, i, Y), Y));
    }
  }
  for (int i = 1; i <= (int)(Q); ++i) printf("%d\n", ans[i]);
}
void testgen() {
  FILE* f = fopen("input.txt", "w");
  srand(time(0));
  fclose(f);
}
int main(int argc, char* argv[]) {
  cout << fixed;
  cout.precision(12);
  solve();
  return 0;
}
