值域是[0,mx]的
#include<bits/stdc++.h>
using namespace std;
#define _for(i, a, b) for(int i = (a); i <= (b); ++i)
const int NN = 2E5 + 5;
int mx;
struct SegTree{
int id = 0;
struct Node{
int cnt = 0, lson = 0, rson = 0;
}T[NN * 35];
void Upd(int &x, int hx, int k, int d, int l = 0, int r = mx){
if(l > k || r < k) return;
x = ++id;
auto &t = T[x], &h = T[hx];
t = h, t.cnt += d;
if(l == r) return;
int mid = l + r >> 1;
Upd(t.lson, h.lson, k, d, l, mid), Upd(t.rson, h.rson, k, d, mid + 1, r);
}
int Qry(int x, int ql, int qr, int l = 0, int r = mx){
if(r < ql || l > qr) return 0;
auto &t = T[x];
if(ql <= l && r <= qr) return t.cnt;
int mid = l + r >> 1;
return Qry(t.lson, ql, qr, l, mid) + Qry(t.rson, ql, qr, mid + 1, r);
}
}ST;
int A[NN], R[NN];
int Query(int l, int r, int ql, int qr){
return ST.Qry(R[r], ql, qr) - ST.Qry(R[l - 1], ql, qr);
}
int main(){
ios::sync_with_stdio(false), cin.tie(0);
int n, m;
cin >> n >> m;
_for(i, 1, n) cin >> A[i], mx = max(mx, A[i]);
_for(i, 1, mx) ST.Upd(R[i], R[i - 1], A[i], 1);
_for(i, 1, m){
int b, x, l, r, ans = 0;
cin >> b >> x >> l >> r;
for(int h = 18, res; h >= 0; --h){
res = 1 << h;
if(!(b & res) && Query(l, r, ans + res - x, ans + res * 2 - 1 - x)) ans += res;
if((b & res) && !Query(l, r, ans - x, ans + res - 1 - x)) ans += res;
}
cout << (b ^ ans) << "\n";
}
return 0;
}