#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int __OneWan_2024 = [](){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return 0;
}();
const int N = 200005;
struct Node {
int Lrt, Rrt;
int sum;
} tr[N << 5];
int tot;
int a[N];
int update(int old, int L, int R, int pos) {
int now = ++tot;
tr[now] = tr[old];
tr[now].sum++;
if (L == R) {
return now;
}
int mid = L + R >> 1;
if (pos <= mid) {
tr[now].Lrt = update(tr[now].Lrt, L, mid, pos);
} else {
tr[now].Rrt = update(tr[now].Rrt, mid + 1, R, pos);
}
return now;
}
vector<int> idx(1, -1);
int query(int QL, int QR, int L, int R, int pos) {
if (R < pos) {
return tr[QR].sum - tr[QL].sum;
}
if (L == R) {
return 0;
}
int mid = L + R >> 1;
int rk = 0;
if (pos >= L) {
rk += query(tr[QL].Lrt, tr[QR].Lrt, L, mid, pos);
}
if (pos >= mid + 1) {
rk += query(tr[QL].Rrt, tr[QR].Rrt, mid + 1, R, pos);
}
return rk;
}
int rt[N];
array<int, 3> q[N];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1 ; i <= n ; i++) {
cin >> a[i];
idx.push_back(a[i]);
}
for (int i = 1 ; i <= m ; i++) {
int L, R, k;
cin >> L >> R >> k;
q[i] = {L, R , k};
idx.push_back(k);
}
sort(begin(idx), end(idx));
idx.resize(unique(begin(idx), end(idx)) - begin(idx));
int len = idx.size() - 1;
for (int i = 1 ; i <= n ; i++) {
a[i] = lower_bound(begin(idx), end(idx), a[i]) - begin(idx);
}
for (int i = 1 ; i <= m ; i++) {
q[i][2] = lower_bound(begin(idx), end(idx), q[i][2]) - begin(idx);
}
for (int i = 1 ; i <= n ; i++) {
rt[i] = update(rt[i - 1], 1, len, a[i]);
}
for (int i = 1 ; i <= m ; i++) {
auto [L, R, k] = q[i];
cout << query(rt[L - 1], rt[R], 1, len, k) << "\n";
}
return 0;
}