#include #include #include #include #include #include #include #include #include using namespace atcoder; using namespace std; using ll = long long; int op(int a, int b) { return min(a, b); } int e() { return ((int)1e9); } int op2(int a, int b) { return max(a, b); } int e2() { return 0; } int main() { int N, Q;cin >> N >> Q; vector A(N+1, 0); vector C(N+1, 0); for (int i = 1;i <= N;i++) { cin >> A[i]; C[A[i]]++; } for (int i = 1;i <= N;i++) C[i] += C[i-1]; vector L(Q), R(Q); vector> EV(N+1); for (int i = 0;i < Q;i++) { cin >> L[i] >> R[i]; EV[L[i]].push_back(i); } segtree MNSEG(A); segtree MXSEG(A); deque st; vector RES(Q); for (int i = N;i >= 1;i--) { while (!st.empty() and A[st.front()] < A[i]) st.pop_front(); st.push_front(i); for (auto id : EV[i]) { int r = R[id]; int mn = MNSEG.prod(i,r+1); int mx = MXSEG.prod(i,r+1); int ok = 0; int ng = st.size(); while (ng - ok > 1) { int mid = (ok + ng) / 2; if (st.at(mid) <= r) { ok = mid; } else { ng = mid; } } int ov = (C[mx] - C[mn-1]) - (r-i+1); int res = (mx-mn) - ok - ov; RES[id] = res; } } for (int i = 0;i < Q;i++) cout << RES[i] << endl; }