func_code_string: #include <bits/stdc++.h>   using namespace std;   inline int read() {     int x = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       x = x * 10 + ch -  0 ;       ch = getchar();     }     return x * f;   }   inline void write(int x) {     if (x > 9) write(x / 10);     putchar(x % 10 +  0 );   }   inline void writeln(int x) {     write(x);     putchar(  n );   }   const int N = 1000005;   struct node {     int l, r;   } b[N];   struct que {     int l, r, id;   } c[N];   int now;   int Ans[N];   int n, k, q;   int Mx[N * 4], pos[N * 4];   int Mxdis[N];   int stkc[N], topc;   int Pos, ans;   inline bool cmp2(node a, node b) {     return a.r < b.r || (a.r == b.r && a.l > b.l);   }   inline bool cmp3(que a, que b) {     return a.r < b.r || (a.r == b.r && a.l > b.l);   }   inline void change(int x, int y) {     int l = 1, r = n, num = 1;     while (1) {       int mid = (l + r) >> 1;       if (Mx[num] < y) pos[num] = x, Mx[num] = y;       if (l == r) break;       if (x <= mid)         r = mid, num = (num << 1);       else         l = mid + 1, num = (num << 1 | 1);     }   }   inline void query(int num, int l, int r, int x, int y) {     if (x <= l && r <= y) {       if (Mx[num] > ans) {         Pos = pos[num];         ans = Mx[num];       }       return;     }     int mid = (l + r) >> 1;     if (x <= mid) query(num << 1, l, mid, x, y);     if (y > mid) query(num << 1 | 1, mid + 1, r, x, y);   }   int main() {     n = read();     k = read();     for (int i = 1; i <= k; ++i) b[i].l = read(), b[i].r = read();     q = read();     for (int i = 1; i <= q; ++i) c[i].l = read(), c[i].r = read(), c[i].id = i;     sort(b + 1, b + k + 1, cmp2);     sort(c + 1, c + q + 1, cmp3);     now = 1;     for (int i = 1; i <= n; ++i) Mxdis[i] = i;     for (int i = 1; i <= q; ++i) {       while (now <= k && b[now].r <= c[i].r) {         if (Mxdis[b[now].l] < b[now].r) {           change(b[now].l, b[now].r);           Mxdis[b[now].l] = b[now].r;         }         ++now;       }       topc = 0;       stkc[++topc] = c[i].l;       int last = c[i].l;       while (1) {         int x = stkc[topc];         Pos = 0, ans = 0;         query(1, 1, n, last, Mxdis[x]);         if (ans > Mxdis[x])           stkc[++topc] = Pos, last = Mxdis[x];         else           break;       }       int mm = Mxdis[stkc[topc--]];       while (topc > 0) {         change(stkc[topc], mm);         Mxdis[stkc[topc--]] = mm;       }       Ans[c[i].id] = mm;     }     for (int i = 1; i <= q; ++i) writeln(Ans[i]);     return 0;   }   