Submission #1151454

#TimeUsernameProblemLanguageResultExecution timeMemory
1151454IssaAbracadabra (CEOI22_abracadabra)C++20
100 / 100
388 ms27932 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define ent "\n" const int maxn = 2e6 + 100; const ll INF = (ll)1e18 + 100; const int inf = 1e7 + 100; const ll MOD = 1e9 + 7; const int maxl = 16; const ll P = 31; int n, q; int f[maxn]; int a[maxn]; int b[maxn]; int r[maxn]; int ans[maxn]; int d[maxn * 4]; void upd(int i, int x, int v = 1, int tl = 1, int tr = n){ if(tl == tr){ d[v] = x; } else{ int mid = (tl + tr) >> 1; if(i <= mid) upd(i, x, v<<1, tl, mid); else upd(i, x, v<<1|1, mid+1, tr); d[v] = d[v<<1] + d[v<<1|1]; } } pii get(int k, int v = 1, int tl = 1, int tr = n){ if(tl == tr) return {tl, k}; int mid = (tl + tr) >> 1; if(d[v<<1] >= k) return get(k, v<<1, tl, mid); else return get(k - d[v<<1], v<<1|1, mid+1, tr); } void test(){ cin >> n >> q; for(int i = 1; i <= n; i++){ cin >> a[i]; } vector<pair<int, pii>> v; for(int i = 1; i <= q; i++){ int t, p; cin >> t >> p; if(!t) ans[i] = a[p]; else v.push_back({t, {p, i}}); } for(int k = 1, i = 1, j = n / 2 + 1; k <= n; k++){ if(i <= n / 2 && (j > n || a[i] < a[j])) b[k] = a[i++]; else b[k] = a[j++]; } for(int i = n; i > 0; i--){ a[i] = b[i]; f[a[i]] = i; r[i] = i + 1; while(r[i] <= n && a[r[i]] < a[i]) r[i] = r[r[i]]; } for(int i = 1; i <= n; i = r[i]){ upd(a[i], r[i] - i); } v.push_back({1, {0, 0}}); sort(v.begin(), v.end()); for(int i = 1; i < v.size(); i++){ for(int cnt = 0; cnt < v[i].first - v[i-1].first; cnt++){ auto [x, d] = get(n / 2); x = f[x]; if(r[x] - x == d) break; int end = r[x]; r[x] = x + d; for(int i = x; i < end; i = r[i]){ r[i] = min(r[i], end); upd(a[i], r[i] - i); } } auto [p, id] = v[i].second; auto [x, d] = get(p); ans[id] = a[f[x] + d - 1]; } for(int i = 1; i <= q; i++){ cout << ans[i] << ent; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; while(t--) test(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...