/*************************************************
Author :supermaker
Created Time :2016/1/15 0:17:04
File Location :C:\Users\abcd\Desktop\TheEternalPoet
**************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <set>
#include <bitset>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <utility>
#include <complex>
#include <numeric>
#include <functional>
#include <cmath>
#include <ctime>
#include <climits>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cassert>
using namespace std;
#define CFF freopen ("aaa.txt", "r", stdin)
#define CPPFF ifstream cin ("aaa.txt")
#define DB(ccc) cout << #ccc << " = " << ccc << endl
#define PB push_back
#define MP(A, B) make_pair(A, B)
typedef long long LL;
typedef unsigned long long ULL;
typedef double DB;
typedef pair <int, int> PII;
typedef pair <int, bool> PIB;
const int INF = 0x7F7F7F7F;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = 2 * acos (0.0);
const int maxn = 1e5 + 6666;
int sorted[maxn], tree[30][maxn], toleft[30][maxn];
void build (int dep, int l, int r)
{
if (l == r) return ;
int mid = (l + r) >> 1;
int same = mid - l + 1;
for (int i = l; i <= r; i++)
if (tree[dep][i] < sorted[mid])
same--;
int lpos = l, rpos = mid + 1;
for (int i = l; i <= r; i++)
{
if (tree[dep][i] < sorted[mid])
tree[dep+1][lpos++] = tree[dep][i];
else if (tree[dep][i] == sorted[mid] && same > 0)
{
tree[dep+1][lpos++] = tree[dep][i];
same--;
}
else
tree[dep+1][rpos++] = tree[dep][i];
toleft[dep][i] = toleft[dep][l-1] + (lpos - l);
}
build (dep + 1, l, mid);
build (dep + 1, mid + 1, r);
}
int query (int dep, int L, int R, int l, int r, int k)
{
if (l == r) return tree[dep][l];
int mid = (L + R) >> 1;
int tot = toleft[dep][r] - toleft[dep][l-1];
if (tot >= k)
{
int newl = L + toleft[dep][l-1] - toleft[dep][L-1];
int newr = newl + tot - 1;
return query (dep + 1, L, mid, newl, newr, k);
}
else
{
int newr = r + toleft[dep][R] - toleft[dep][r];
int newl = newr - (r - l - tot);
return query (dep + 1, mid + 1, R, newl, newr, k - tot);
}
}
int main()
{
//CFF;
//CPPFF;
int t, flag = 1;
scanf ("%d", &t);
while (t--)
{
int n, q;
memset (tree, 0, sizeof (tree));
memset (toleft, 0, sizeof (toleft));
scanf ("%d%d", &n, &q);
for (int i = 1; i <= n; i++)
{
scanf ("%d", &tree[0][i]);
sorted[i] = tree[0][i];
}
sort (sorted + 1, sorted + 1 + n);
build (0, 1, n);
printf ("Case %d:\n", flag++);
for (int i = 1; i <= q; i++)
{
int ll, rr, kk;
scanf ("%d%d%d", &ll, &rr, &kk);
ll++, rr++;
int low = 1, high = rr - ll + 1, res = 0;
while (low <= high)
{
int mid = (low + high) >> 1;
int val = query (0, 1, n, ll, rr, mid);
if (val <= kk) low = mid + 1, res = mid;
else high = mid - 1;
}
printf ("%d\n", res);
}
}
return 0;
}