/* I will wait for you*/ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <algorithm> #include <iostream> #include <fstream> #include <vector> #include <queue> #include <deque> #include <map> #include <set> #include <string> #define make make_pair #define fi first #define se second using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; const int maxn = 1000010; const int maxm = 1010; const int maxs = 30; const int inf = 0x3f3f3f3f; const int P = 1000000007; const double error = 1e-9; inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch <= 47 || ch >= 58) f = (ch == 45 ? -1 : 1), ch = getchar(); while (ch >= 48 && ch <= 57) x = x * 10 + ch - 48, ch = getchar(); return x * f; } struct node { node *ls, *rs; int val; } *root[maxn], *tl[maxn], *tr[maxn], *null; int n, m, bin[maxn], x[maxn], y[maxn], tn[maxn]; node* insert(node* p, int num, int deep) { node* t = new node(); *t = *p, t -> val++; if (deep >= 0) { if ((num & bin[deep]) == 0) t -> ls = insert(t -> ls, num, deep - 1); if ((num & bin[deep]) != 0) t -> rs = insert(t -> rs, num, deep - 1); } return t; } int find_kth(int deep, int top, int k) { int ans = 0, tmp = 0; if (deep >= 0) { for (int i = 0; i < top; i++) { if ((tn[i] & bin[deep]) == 0) tmp += tr[i] -> rs -> val - tl[i] -> rs -> val; if ((tn[i] & bin[deep]) != 0) tmp += tr[i] -> ls -> val - tl[i] -> ls -> val; } if (tmp >= k) { for (int i = 0; i < top; i++) { if ((tn[i] & bin[deep]) == 0) tl[i] = tl[i] -> rs, tr[i] = tr[i] -> rs; if ((tn[i] & bin[deep]) != 0) tl[i] = tl[i] -> ls, tr[i] = tr[i] -> ls; } ans = find_kth(deep - 1, top, k) + bin[deep]; } else { for (int i = 0; i < top; i++) { if ((tn[i] & bin[deep]) == 0) tl[i] = tl[i] -> ls, tr[i] = tr[i] -> ls; if ((tn[i] & bin[deep]) != 0) tl[i] = tl[i] -> rs, tr[i] = tr[i] -> rs; } ans = find_kth(deep - 1, top, k - tmp); } } return ans; } void init() { root[0] = null = new node(); null -> ls = null -> rs = null, null -> val = 0; for (int i = 0; i <= maxs; i++) bin[i] = 1 << i; } int main() { n = read(), m = read(), init(); for (int i = 1; i <= n; i++) x[i] = read(); for (int i = 1; i <= m; i++) y[i] = read(); for (int i = 1; i <= m; i++) root[i] = insert(root[i - 1], y[i], maxs); int q = read(); while (q--) { int xl = read(), xr = read(), yl = read(), yr = read(), k = read(); for (int i = xl, top = 0; i <= xr; i++, top++) tl[top] = root[yl - 1], tr[top] = root[yr], tn[top] = x[i]; printf("%d\n", find_kth(maxs, xr - xl + 1, k)); } return 0; }