//Accepted 14796 KB 453 ms
//划分树
//把查询的次数m打成n,也是醉了一晚上!!!
//二分l--r区间第k大的数和h比较
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
/**
* This is a documentation comment block
* 如果有一天你坚持不下去了,就想想你为什么走到这儿!
* @authr songt
*/
;
struct node
{
int val[imax_n];
int num[imax_n];
}f[];
int a[imax_n];
int sorted[imax_n];
int n,m;
void build(int t,int l,int r)
{
if (l==r) return ;
;
;
;
for (int i=l;i<=r;i++)
if (f[t].val[i]<sorted[mid]) isame--;
int ln=l;
;
for (int i=l;i<=r;i++)
{
if (i==l)
{
f[t].num[i]=;
}
];
if (f[t].val[i]<sorted[mid])
{
f[t].num[i]++;
f[t+].val[ln++]=f[t].val[i];
}
else if (f[t].val[i]>sorted[mid])
{
f[t+].val[rn++]=f[t].val[i];
}
else
{
if (isame>same)
{
same++;
f[t].num[i]++;
f[t+].val[ln++]=f[t].val[i];
}
else
{
f[t+].val[rn++]=f[t].val[i];
}
}
}
build(t+,l,mid);
build(t+,mid+,r);
}
int query(int t,int l,int r,int a,int b,int k)
{
if (l==r) return f[t].val[l];
;
int s,ss;
if (a==l)
{
ss=;
s=f[t].num[b];
}
else
{
ss=f[t].num[a-];
s=f[t].num[b]-ss;
}
if (s>=k)
{
a=l+ss;
b=l+ss+s-;
,l,mid,a,b,k);
}
else
{
int b1=a-l-ss;
-s;
a=mid++b1;
b=mid+b1+b2;
,mid+,r,a,b,k-s);
}
}
int x,y,h;
void slove()
{
build(,,n);
;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&h);
x++;
y++;
,r=y-x+;
;
;
while (l<=r)
{
mid=(l+r)/;
,,n,x,y,mid);
//printf("pre :l=%d r=%d mid=%d t=%d\n",l,r,mid,t);
;
else
{
ans=mid;
l=mid+;
}
//printf("l=%d r=%d t=%d\n",l,r,t);
}
printf("%d\n",ans);
}
}
int main()
{
int T;
;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
;i<=n;i++)
{
scanf("%d",&a[i]);
f[].val[i]=sorted[i]=a[i];
}
sort(sorted+,sorted+n+);
printf("Case %d:\n",++t);
slove();
}
;
}