#include using namespace std; #define rep(i,a,b) for(int i =a; i <(b); ++i) struct Node { int last; int first; bool good; }; struct Seg { vector t; int n; Seg(int n, const vector &a) : n(n) { t.resize(4 * n + 1, Node {}); build(1, 1, n, a); } Node combine(Node l, Node r) { l.good &= r.good; if (l.last > r.first) l.good = false; l.last = r.last; return l; } void build(int v, int l, int r, const vector &a) { if (l == r) { t[v] = {a[l], a[r], true}; return; } int mid = (l + r) / 2; build(v * 2, l, mid, a); build(v * 2 + 1, mid + 1, r, a); t[v] = combine(t[v*2], t[v*2+1]); } Node get(int v, int l, int r, int tl, int tr) { if (l == tl && r == tr) { return t[v]; } int mid = (l + r) / 2; optional lh = nullopt; optional rh = nullopt; if (mid >= tl) lh = get(v*2, l, mid, tl, min(mid, tr)); if (mid + 1 <= tr) rh = get(v*2+1, mid+1, r, max(mid+1, tl), tr); if (lh == nullopt) return *rh; if (rh == nullopt) return *lh; return combine(*lh, *rh); } }; int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int n, q; cin >> n >> q; vector a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } Seg seg{n, a}; while (q--) { int l, r; cin >> l >> r; cout << (seg.get(1, 1, n, l, r).good ? "YES" : "NO") << "\n"; } return 0; }