#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int maxn=2e6+5;
int a[maxn];
int n;
int K[maxn];
vector<int> R[maxn];
int tree[maxn];
int lb(int x){
return x&-x;
}
void add(int x,int y){
while(x<=maxn){
tree[x]+=y;
x+=lb(x);
}
}
int qry(int x){
int an=0;
while(x){
an+=tree[x];
x-=lb(x);
}
return an;
}
int ans[maxn];
int main(){
int m;
int l,r,k;
scanf("%d%d",&n,&m);
rep(i,1,n){
scanf("%d",&a[i]);
}
rep(i,1,m){
scanf("%d%d%d",&l,&r,&k);
R[l-1].push_back(-i);
R[r].push_back(i);
K[i]=k;
}
rep(i,1,n){
add(a[i],1);
for(int j=0;j<R[i].size();j++){
if(R[i][j]>0)
ans[R[i][j]]+=qry(K[R[i][j]]);
else
ans[-R[i][j]]-=qry(K[R[i][j]]);
}
}
rep(i,1,m)
printf("%d\n",ans[i]);
}
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int maxn=2e6+5;
int a[maxn];
int n;
struct node{
int x,id;
};
vector<node> R[maxn];
int tree[maxn];
int lb(int x){
return x&-x;
}
void add(int x,int y){
while(x<=maxn){
tree[x]+=y;
x+=lb(x);
}
}
int qry(int x){
int an=0;
while(x){
an+=tree[x];
x-=lb(x);
}
return an;
}
int ans[maxn];
int main(){
int m;
int l,r,k;
scanf("%d%d",&n,&m);
rep(i,1,n){
scanf("%d",&a[i]);
}
rep(i,1,m){
scanf("%d%d%d",&l,&r,&k);
R[l-1].push_back({k,-i});
R[r].push_back({k,i});
}
rep(i,1,n){
add(a[i],1);
for(node j:R[i]){
if(j.id>0)
ans[j.id]+=qry(j.x);
else
ans[-j.id]-=qry(j.x);
}
}
rep(i,1,m)
printf("%d\n",ans[i]);
}