#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int T,n,m;
int a[N],t[20][N];
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;
}
void build(int s,int l,int r)
{
if (l==r)
{
t[s][l]=a[l];
return;
}
int mid=(l+r)>>1;
build(s+1,l,mid); build(s+1,mid+1,r);
for (int i=l,j=mid+1,k=l;i<=mid||j<=r;)
{
if (j>r) t[s][k++]=t[s+1][i++];
else if (i>mid || t[s+1][i]>t[s+1][j]) t[s][k++]=t[s+1][j++];
else t[s][k++]=t[s+1][i++];
}
}
int query(int s,int l,int r,int L,int R,int x,int y)
{
if (x>y ) return 0;
if (L<=l&r<=R)
{
//printf("x=%d,y=%d,l=%d,r=%d,>y=%d,>=x=%d\n",x,y,l,r,upper_bound(t[s]+l,t[s]+r+1,y),upper_bound(t[s]+l,t[s]+r+1,x));
return upper_bound(t[s]+l,t[s]+r+1,y)-lower_bound(t[s]+l,t[s]+r+1,x);
}
int mid=(l+r)>>1,ans=0;
if (L<=mid) ans+=query(s+1,l,mid,L,R,x,y);
if (R>mid) ans+=query(s+1,mid+1,r,L,R,x,y);
return ans;
}
int main()
{
// freopen("14162.in","r",stdin);
// freopen("1.out","w",stdout);
T=read();
while(T--)
{
n=read(); m=read();
//memset(t,0,sizeof(t));
for (int i=1;i<=n;i++) a[i]=read();
build(0,1,n);
int ans=0;
int L,R,p,k;
while (m--)
{
L=read(); R=read(); p=read(); k=read();
L^=ans; R^=ans; p^=ans; k^=ans;
int l=0,r=1000005;
while (l<=r)
{
int mid=(l+r)>>1;
//cout<<mid<<endl;
if (query(0,1,n,L,R,p-mid,p+mid)>=k) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}