#include #include #include #include using namespace std; typedef pair PII; struct Query { int l, r, id; bool operator <(Query o) const { return r < o.r; } }; const int N = 100010; Query qs[N]; stack stk; int n, q, a[N], pre[N], ans[N]; struct BIT { int tr[N]; int LowBit(int x) { return x & -x; } void Add(int x, int v) { for (int i = x; i < N; i += LowBit(i)) tr[i] += v; } int Sum(int x) { int ret = 0; for (int i = x; i; i -= LowBit(i)) ret += tr[i]; return ret; } }; BIT bit; int main() { // freopen("big.in", "r", stdin); // freopen("big.out", "w", stdout); scanf("%d%d", &n, &q); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); while (!stk.empty()) { if (a[stk.top()] < a[i]) stk.pop(); else break; } if (!stk.empty()) pre[i] = stk.top(); else pre[i] = 0; stk.push(i); } for (int i = 1, x; i <= q; ++i) { scanf("%d%d%d", &x, &qs[i].l, &qs[i].r); qs[i].id = i; } sort(qs + 1, qs + q + 1); for (int i = 1; i <= q; ++i) { for (int j = qs[i - 1].r + 1; j <= qs[i].r; ++j) { bit.Add(pre[j] + 1, 1); } ans[qs[i].id] = bit.Sum(qs[i].l) - (qs[i].l - 1); } for (int i = 1; i <= q; ++i) printf("%d\n", ans[i]); return 0; }