#include <bits/stdc++.h>   using namespace std;   const int N = 2e5;   int p[N + 10], a[N + 10], pos[N + 10];   struct seg {     int l, r, min;   } t[N * 4 + 10];   int nxt[N + 10][20];   int get(int x, int n) {     int ans = x, cnt = 0;     while (n) {       if (n & 1) ans = nxt[ans][cnt];       if (ans >= 0x7f7f7f7f) break;       n >>= 1;       cnt++;     }     return ans;   }   int n;   void build(int p, int l, int r) {     t[p].l = l;     t[p].r = r;     if (l == r) {       t[p].min = get(l, n - 1);       return;     }     int mid = (l + r) / 2;     build(p * 2, l, mid);     build(p * 2 + 1, mid + 1, r);     t[p].min = min(t[p * 2].min, t[p * 2 + 1].min);   }   int query(int p, int l, int r) {     if (l <= t[p].l && t[p].r <= r) return t[p].min;     int mid = (t[p].l + t[p].r) / 2, ans = 0x7f7f7f7f;     if (l <= mid) ans = min(ans, query(p * 2, l, r));     if (r > mid) ans = min(ans, query(p * 2 + 1, l, r));     return ans;   }   int ans[N + 10];   int main() {     int m, q;     scanf( %d%d%d , &n, &m, &q);     for (int i = 1; i <= n; i++) {       scanf( %d , &p[i]);       pos[p[i]] = i;     }     for (int i = 1; i <= m; i++) {       scanf( %d , &a[i]);       a[i] = pos[a[i]];     }     memset(pos, 0x7f, sizeof(pos));     for (int i = m; i; i--) {       nxt[i][0] = pos[a[i] == n ? 1 : a[i] + 1];       pos[a[i]] = i;     }     int logn = (int)(log(n) / log(2)) + 1;     for (int s = 1; s <= logn; s++) {       for (int i = 1; i <= m; i++) {         if (i + (1 << s) - 1 > m) {           nxt[i][s] = 0x7f7f7f7f;           continue;         }         if (nxt[i][s - 1] > m) {           nxt[i][s] = 0x7f7f7f7f;           continue;         }         nxt[i][s] = nxt[nxt[i][s - 1]][s - 1];       }     }     build(1, 1, m);     for (int i = 1; i <= q; i++) {       int l, r;       scanf( %d%d , &l, &r);       int tmp = query(1, l, r);       ans[i] = (tmp <= r);     }     for (int i = 1; i <= q; i++) putchar(48 ^ ans[i]);     return 0;   }   