#include <bits/stdc++.h> using namespace std; using Pii = pair<int, int>; const int N = 2e5 + 5, inf = 1e9; struct F { int l, r; } x[N]; struct node { int x; } tr[N * 4]; int t, n, q, a[N], ans[N]; stack<int> stk; vector<Pii> v[N], que[N]; void build(int i, int l, int r) { if (l == r) { tr[i].x = inf; return ; } int mid = (l + r) >> 1; build(i * 2, l, mid); build(i * 2 + 1, mid + 1, r); tr[i].x = inf; } void modify(int i, int l, int r, int p, int x) { if (l == r) { tr[i].x = min(tr[i].x, x); return ; } int mid = (l + r) >> 1; if (mid >= p) { modify(i * 2, l, mid, p, x); } else modify(i * 2 + 1, mid + 1, r, p, x); tr[i].x = min(tr[i * 2].x, tr[i * 2 + 1].x); } int query(int i, int l, int r, int x, int y) { if (l > y || r < x) { return inf; } if (l >= x && r <= y) { return tr[i].x; } int mid = (l + r) >> 1; return min(query(i * 2, l, mid, x, y), query(i * 2 + 1, mid + 1, r, x, y)); } void Solve() { cin >> n >> q; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { while (!stk.empty() && a[i] < a[stk.top()]) { stk.pop(); } if (stk.empty()) { x[i].l = 0; } else x[i].l = stk.top(); stk.push(i); } while (!stk.empty()) { stk.pop(); } for (int i = n; i >= 1; i--) { while (!stk.empty() && a[i] > a[stk.top()]) { stk.pop(); } if (stk.empty()) { x[i].r = n + 1; } else x[i].r = stk.top(); stk.push(i); } for (int i = 1; i <= n; i++) { if (!x[i].l || x[i].r == n + 1) { continue; } v[x[i].l].push_back({x[i].r, (x[i].r - x[i].l + 1) - 3}); } for (int i = 1, l, r; i <= q; i++) { cin >> l >> r; que[l].push_back({r, i}); } build(1, 1, n); for (int i = n; i >= 1; i--) { for (auto cur : v[i]) { modify(1, 1, n, cur.first, cur.second); } for (auto cur : que[i]) { int tmp = query(1, 1, n, i, cur.first); if (tmp == inf) { ans[cur.second] = -1; } else ans[cur.second] = (cur.first - i + 1) - tmp; } } for (int i = 1; i <= q; i++) { cout << ans[i] << "\n"; } while (!stk.empty()) { stk.pop(); } for (int i = 1; i <= n; i++) { v[i].clear(); que[i].clear(); } } int main() { // freopen("5.in", "r", stdin); // freopen("ans.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); cin >> t; while (t--) { Solve(); } return 0; }
Note.ms
/998244353