Submission #792548

#TimeUsernameProblemLanguageResultExecution timeMemory
792548t6twotwoAbracadabra (CEOI22_abracadabra)C++17
100 / 100
1116 ms57684 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, Q; cin >> N >> Q; vector<int> A(N); for (int &x : A) { cin >> x; } vector<int> queries(Q), ans(Q); vector<vector<int>> q(N + 1); for (int i = 0; i < Q; i++) { int t, p; cin >> t >> p; t = min(t, N); p--; queries[i] = p; if (t == 0) { ans[i] = A[p]; } else { q[t].push_back(i); } } vector<int> f(N, N), stk; for (int i = N - 1; i >= 0; i--) { while (!stk.empty() && A[stk.back()] < A[i]) { stk.pop_back(); } if (!stk.empty()) { f[i] = stk.back(); } stk.push_back(i); } vector<int> bit(N + 1); auto add = [&](int p, int x) { for (int i = p; i <= N; i += i & -i) { bit[i] += x; } }; auto sum = [&](int p) { int s = 0; for (int i = p; i; i -= i & -i) { s += bit[i]; } return s; }; set<tuple<int, int, int>> s, t; for (int i = 0; i < N; i = f[i]) { s.emplace(A[i], i, f[i]); add(A[i], f[i] - i); } int T = N; for (int i = 1; i <= N; i++) { if (T > N / 2) { while (1) { auto [_, l, r] = *prev(s.end()); if (T - r + l < N / 2) { break; } T -= r - l; t.insert(*prev(s.end())); s.erase(prev(s.end())); } if (T > N / 2) { auto [v, l, r] = *prev(s.end()); s.erase(prev(s.end())); int m = r - T + N / 2; s.emplace(v, l, m); add(v, m - r); for (int i = m; i < r; i = f[i]) { s.emplace(A[i], i, min(r, f[i])); add(A[i], min(r, f[i]) - i); } } } for (int k : q[i]) { int p = queries[k]; int l = 1, r = N; while (l < r) { int m = (l + r) / 2; if (sum(m) > p) { r = m; } else { l = m + 1; } } auto [v, L, R] = *s.lower_bound({l, 0, 0}); if (v == l) { ans[k] = A[R - sum(l) + p]; } else { auto [v, L, R] = *t.lower_bound({l, 0, 0}); ans[k] = A[R - sum(l) + p]; } } } for (int x : ans) { cout << x << "\n"; } return 6/22; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...