#include <bits/stdc++.h>   using namespace std;   namespace thecold {   inline int read() {     int res = 0;     bool flag = false;     char c = getchar();     while (!isdigit(c)) flag = (c ==  - ), c = getchar();     while (isdigit(c)) res = res * 10 + (c ^ 48), c = getchar();     return !flag ? res : -res;   }   const int Max_n = 1e5 + 5;   int bak[Max_n], n, m, q;   struct node {     int l, r, tagl, tagv, mx, mmx;     node(int a, int b) { l = a, r = b, tagv = tagl = mx = mmx = 0; }     node() {}   } tree[Max_n << 3];   inline void push_up(const int tr) {     int ls = tr << 1, rs = tr << 1 | 1;     if (tree[tr].l == tree[tr].r) return;     if (tree[ls].mx > tree[rs].mx)       tree[tr].mx = tree[ls].mx, tree[tr].mmx = max(tree[ls].mmx, tree[rs].mx);     else if (tree[ls].mx < tree[rs].mx)       tree[tr].mx = tree[rs].mx, tree[tr].mmx = max(tree[ls].mx, tree[rs].mmx);     else       tree[tr].mx = tree[ls].mx, tree[tr].mmx = max(tree[ls].mmx, tree[rs].mmx);   }   inline void build(const int l, const int r, const int tr) {     tree[tr] = node(l, r);     if (l == r) return tree[tr].mx = l, tree[tr].mmx = -Max_n, void();     int mid = (l + r) >> 1;     build(l, mid, tr << 1), build(mid + 1, r, tr << 1 | 1);     push_up(tr);   }   inline void cop(node &a, node b, const int tr) {     a.mx = a.tagv = b.tagv, !a.tagl && (a.tagl = b.tagl);   }   inline void push_down(const int tr) {     if (!tree[tr].tagl) return;     int ls = tr << 1, rs = tr << 1 | 1;     if (tree[ls].mx == tree[tr].tagl) cop(tree[ls], tree[tr], tr);     if (tree[rs].mx == tree[tr].tagl) cop(tree[rs], tree[tr], tr);     tree[tr].tagl = tree[tr].tagv = 0;   }   inline void change(const int l, const int r, const int va, const int lim,                      const int tr) {     int ll = tree[tr].l, rr = tree[tr].r;     if (ll > r || rr < l) return;     if (tree[tr].mx < lim) return;     push_down(tr);     if (l <= ll && rr <= r) {       if (tree[tr].mmx < lim)         return tree[tr].tagl = tree[tr].mx, tree[tr].tagv = tree[tr].mx = va,                void();     }     change(l, r, va, lim, tr << 1), change(l, r, va, lim, tr << 1 | 1);     push_up(tr);   }   int ans[Max_n];   struct Node {     int l, bel;     Node(int a, int b) { l = a, bel = b; }     Node() {}   };   vector<Node> v[Max_n];   inline int query(const int pos, const int tr) {     int ll = tree[tr].l, rr = tree[tr].r;     if (ll == rr) return tree[tr].mx;     push_down(tr);     int mid = (ll + rr) >> 1;     if (mid >= pos) return query(pos, tr << 1);     return query(pos, tr << 1 | 1);   }   inline void main() {     n = read(), m = read();     build(1, n, 1);     for (int i = 1; i <= m; ++i) {       int ui = read(), vi = read();       bak[vi] = ui;     }     q = read();     for (int i = 1; i <= q; ++i) {       int li = read(), ri = read();       v[ri].push_back(Node(li, i));     }     for (int now = 1; now <= n; ++now) {       if (bak[now]) change(1, bak[now], now, bak[now], 1);       int sz = v[now].size();       for (int i = 0; i < sz; ++i) ans[v[now][i].bel] = query(v[now][i].l, 1);     }     for (int i = 1; i <= q; ++i) printf( %d n , ans[i]);   }   }  // namespace thecold   int main() {     thecold::main();     return 0;   }