#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
typedef long long ll;
struct Op
{
ll op;
ll y;
ll l,r;
ll id;
Op() {}
Op(int op,int y,int l,int r=0,int id=0) : op(op),y(y),l(l),r(r),id(id) {}
bool operator<(const Op &that) const
{
if(y==that.y) return op<that.op;
return y<that.y;
}
}op[N];
struct Node
{
int sum;
}node[N];
void build(int w,int l,int r)
{
if(l==r) return ;
int mid=(l+r)/2;
int ls=2*w,rs=ls+1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void add(int w,int l,int r,int x,int k)
{
node[w].sum+=k;
if(l==r) return ;
int mid=(l+r)/2;
int ls=2*w,rs=2*w+1;
if(x<=mid) add(ls,l,mid,x,k);
else add(rs,mid+1,r,x,k);
}
ll getsum(int w,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr) return node[w].sum;
ll mid=(l+r)/2,ans=0;
int ls=2*w,rs=ls+1;
if(ql<=mid) ans+=getsum(ls,l,mid,ql,qr);
if(qr>mid) ans+=getsum(rs,mid+1,r,ql,qr);
return ans;
}
ll n,m,arr[N],mymax;
ll tot,ans[N];
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&arr[i]);
mymax=max(mymax,arr[i]);
op[++tot]=Op(1,arr[i],i);
}
for(int i=1;i<=m;i++)
{
ll l,r,x;
scanf("%lld%lld%lld",&l,&r,&x);
mymax=max(mymax,r);
op[++tot]=Op(2,x,l,r,i);
}
sort(op+1,op+tot+1);
build(1,1,mymax);
for(int i=1;i<=tot;i++)
{
if(op[i].op==1) add(1,1,mymax,op[i].l,1);
else ans[op[i].id]=getsum(1,1,mymax,op[i].l,op[i].r);
}
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}