int n, q, b; int a[kMaxN], l[kMaxN], r[kMaxN], res[kMaxN], mex[kMaxN]; std::vector<int> qq[kMaxN]; std::vector<std::pair<int, int>> seg[kMaxN]; std::vector<std::array<int, 20>> nxt[kMaxN];
structODT { std::set<std::pair<int, int>> st; voidinit(int n, int *a){ st.clear(); for (int i = 1; i <= n; ++i) if (i == 1 || a[i] != a[i - 1]) st.emplace(i, a[i]); } voidsplit(int x){ if (x < 1 || x > n) return; auto [p, v] = *--st.lower_bound({x + 1, 0}); if (p != x) st.emplace(x, v); } voidfix(int x){ return; auto it = st.lower_bound({x, 0}); std::vector<std::pair<int, int>> vec; int c = 0; for (auto i = it; i != st.end() && c <= 3; ++i, ++c) { if (i != st.begin() && i->second == prev(i)->second) vec.emplace_back(*i); } c = 0; if (it != st.begin()) { for (auto i = prev(it); i != st.begin() && c <= 3; --i, ++c) { if (i ->second == prev(i)->second) vec.emplace_back(*it); } } for (auto p : vec) st.erase(p); } std::vector<std::pair<int, int>> chkmin(int x, int v) { // 对 [1, x] chkmin v split(x + 1); auto it = --st.lower_bound({x + 1, 0}); std::vector<std::pair<int, int>> vec; for (;; --it) { if (it->second > v) vec.emplace_back(*it); elsebreak; if (it == st.begin()) break; } if (!vec.size()) returnfix(x + 1), vec; std::reverse(vec.begin(), vec.end()); for (auto p : vec) st.erase(p); st.emplace(vec[0].first, v); fix(x + 1); return vec; } intquery(int x){ auto it = --st.lower_bound({x + 1, 0}); return it->second; } } odt;
voidgetseg(){ staticint cnt[kMaxN] = {0}, now[kMaxN], lst[kMaxN], nxt[kMaxN] = {0}; for (int i = 1; i <= n; ++i) ++cnt[a[i]]; for (int i = 1; i <= 4e5 + 1; ++i) { lst[i] = n + 1; if (!cnt[i]) { now[n] = i; break; } } for (int i = n; i > 1; --i) { now[i - 1] = now[i]; if (!--cnt[a[i]]) now[i - 1] = std::min(now[i - 1], a[i]); } for (int i = n; i; --i) nxt[i] = lst[a[i]], lst[a[i]] = i; // for (int i = 1; i <= n; ++i) std::cerr << now[i] << " \n"[i == n]; odt.init(n, now); for (int i = 1; i <= n; ++i) { for (auto id : qq[i]) mex[id] = odt.query(r[id]); std::vector<std::pair<int, int>> vec = odt.chkmin(nxt[i] - 1, a[i]); for (auto [p, v] : vec) seg[v].emplace_back(i, p); } // for (auto [l, r] : seg[4]) std::cerr << l << ' ' << r << '\n'; }
voidgetnxt(){ for (int i = 1; i <= n + 1; ++i) { std::sort(seg[i].begin(), seg[i].end()); nxt[i].resize(seg[i].size()); for (int j = (int)seg[i].size() - 1; ~j; --j) { nxt[i][j][0] = std::lower_bound(seg[i].begin(), seg[i].end(), std::pair<int, int>{seg[i][j].second + 1, 0}) - seg[i].begin(); for (int k = 1; k <= std::__lg(n); ++k) { if (nxt[i][j][k - 1] == seg[i].size()) nxt[i][j][k] = seg[i].size(); else nxt[i][j][k] = nxt[i][nxt[i][j][k - 1]][k - 1]; } } } }
voidsolve(){ for (int i = 1; i <= q; ++i) { if (mex[i] == 1) { res[i] = r[i] - l[i] + 1; continue; } int mex = ::mex[i], p = std::lower_bound(seg[mex].begin(), seg[mex].end(), std::pair<int, int>{l[i], 0}) - seg[mex].begin(); int ans = 0; if (p < seg[mex].size()) { for (int j = std::__lg(n); ~j; --j) { assert(p < nxt[mex].size()); // std::cerr << seg[mex].size() << ' ' << j << ' ' << p << ' ' << nxt[mex][p][j] << '\n'; if (nxt[mex][p][j] != seg[mex].size() && seg[mex][nxt[mex][p][j]].second <= r[i]) { p = nxt[mex][p][j], ans += (1 << j); } } } res[i] = ans + 1; } }
std::vector<int> solve(int n, std::vector<int> &v, int q, std::vector<std::pair<int, int>> &queries){ ::n = n, ::q = q; for (int i = 1; i <= n; ++i) a[i] = v[i - 1]; for (int i = 1; i <= q; ++i) { std::tie(l[i], r[i]) = queries[i - 1]; ++l[i], ++r[i]; qq[l[i]].emplace_back(i); // std::cerr << l[i] << ' ' << r[i] << '\n'; } getseg(), getnxt(), solve(); std::vector<int> ans; for (int i = 1; i <= q; ++i) ans.emplace_back(res[i]); return ans; }