#include<bits/stdc++.h>
using namespace std;
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=l;i>=r;--i)
const int N=2e6+5;
int a[N],b[N],n,m,rt[N],l,r,k;
struct seg_t{
struct node{
int ls,rs,s;
}t[N<<5];
int idx=0;
inline int upd(int pr,int l,int r,int x){
int u=++idx;
t[u].ls=t[pr].ls;
t[u].rs=t[pr].rs;
t[u].s=t[pr].s+1;
if(l==r){
return u;
}
int mid=(l+r)>>1;
if(x<=mid) t[u].ls=upd(t[pr].ls,l,mid,x);
else t[u].rs=upd(t[pr].rs,mid+1,r,x);
return u;
}
inline int query(int now,int l,int r,int x){
if(l==r){
return t[now].s;
}
int mid=(l+r)>>1;
if(x<=mid){
return query(t[now].ls,l,mid,x);
}else{
return query(t[now].rs,mid+1,r,x);
}
}
}bit;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
rt[0]=0;
up(i,1,n){
cin>>a[i];b[i]=a[i];
}
sort(b+1,b+n+1);
int sz=unique(b+1,b+n+1)-b-1;
up(i,1,n){
rt[i]=bit.upd(rt[i-1],1,2e6,a[i]);
}
up(i,1,m){
cin>>l>>r>>k;
cout<<bit.query(rt[r],1,2e6,k)-bit.query(rt[l-1],1,2e6,k)<<'\n';
}
return 0;
}