#include using namespace std; using ll = long long; #define rep(i, n) for (int i = 0; i < (int)(n); i++) struct WaveletMatrix { private: int H, N; vector> dat; public: WaveletMatrix(int H, vector A) : H(H), N(A.size()) { dat.assign(H, vector(N + 1)); for (int h = H - 1; h >= 0; h--) { vector dir(N); vector left, right; for (int i = 0; i < N; i++) { dir[i] = A[i] >> h & 1; (dir[i] == 0 ? left : right).push_back(A[i]); } int a = left.size(), b = right.size(); for (int i = 0; i < a; i++) A[i] = left[i]; for (int i = 0; i < b; i++) A[a + i] = right[i]; for (int i = 0; i < N; i++) dat[h][i + 1] += dat[h][i] + dir[i]; } } // 高さh+1、区間[l, r)の子を求める。 tuple get_subtree_range(int h, int l, int r) const { int a0 = l - dat[h][l], a1 = dat[h][l]; int b0 = r - dat[h][r], b1 = dat[h][r]; int c0 = N - dat[h][N]; return {a0, b0, c0 + a1, c0 + b1}; } private: int kth_smallest_rec(int h, int l, int r, int k) const { if (h == 0) return 0; auto [l0, r0, l1, r1] = get_subtree_range(h - 1, l, r); int left_size = r0 - l0; if (k < left_size) { return kth_smallest_rec(h - 1, l0, r0, k); } else { return (1 << (h - 1)) + kth_smallest_rec(h - 1, l1, r1, k - left_size); } } int cnt_less_k_rec(int h, int l, int r, int k) const { if (h == 0) return 0; auto [l0, r0, l1, r1] = get_subtree_range(h - 1, l, r); int left_size = r0 - l0; if (k >> (h - 1) & 1) { return left_size + cnt_less_k_rec(h - 1, l1, r1, k); } else { return cnt_less_k_rec(h - 1, l0, r0, k); } } public: int kth_smallest(int l, int r, int k) { return kth_smallest_rec(H, l, r, k); } int cnt_less_k(int l, int r, int k) { return cnt_less_k_rec(H, l, r, k); } }; int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int n, q; cin >> n; vector a(n); rep(i, n) cin >> a[i]; WaveletMatrix w(30, a); cin >> q; while (q--) { int l, r, x; cin >> l >> r >> x; l--; int c = w.cnt_less_k(l, r, x); int ans = 1 << 30; if (c != 0) { ans = min(ans, x - w.kth_smallest(l, r, c - 1)); } if (c != r - l) { ans = min(ans, w.kth_smallest(l, r, c) - x); } cout << ans << endl; } return 0; }