#include <bits/stdc++.h>
using namespace std;
const int maxn = (1e5+10)*20;
int tn,root[maxn],sum[maxn],lson[maxn],rson[maxn];
int x,y;
void update(int i ,int j,int l,int &r)
{
r = ++tn;
if(i==j){
sum[r] = sum[l]+1;
return;
}
lson[r] = lson[l];rson[r] = rson[l];
int mid = i+j>>1;
if(x <= mid)update(i,mid,lson[l],lson[r]);
else update(mid+1,j,rson[l],rson[r]);
sum[r] = sum[lson[r]]+sum[rson[r]];
}
int query(int i,int j,int l,int r)
{
if(x>y)return 0;
if(x<=i && y>=j)
return sum[r]-sum[l];
int mid = i+j>>1,ret = 0;
if(x <= mid)ret += query(i,mid,lson[l],lson[r]);
if(y>mid) ret += query(mid+1,j,rson[l],rson[r]);
return ret;
}
int num[maxn],nn;
int a[maxn];
int main()
{
int t,n,m;
scanf("%d",&t);
for(int cas = 1; cas <= t; cas++)
{
printf("Case %d:\n",cas);
scanf("%d%d",&n,&m);
nn = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d",a+i);
num[nn++] = a[i];
}
sort(num,num+nn);
nn = unique(num,num+nn)-num;
tn = 0;
for(int i = 1; i <= n; i++)
{
//建树的时候用lower_bound 快速找到原数在离散化后的的排名
x = lower_bound(num,num+nn,a[i])-num;
update(0,nn-1,root[i-1],root[i]);
}
int a,b,c;
while(m--){
scanf("%d%d%d",&a,&b,&c);
//二分快速找到离散后的范围
//[0,c]
x = 0; y = upper_bound(num,num+nn,c)-num-1;
//[c,nn]
//y = nn-1;x = lower_bound(num,num+nn,c)-num;
printf("%d\n",query(0,nn-1,root[a],root[b+1]));
}
}
return 0;
}