Submission #773943

#TimeUsernameProblemLanguageResultExecution timeMemory
773943Valters07Abracadabra (CEOI22_abracadabra)C++14
0 / 100
9 ms9940 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") #define fio ios_base::sync_with_stdio(0);cin.tie(0); #define ll long long #define en cin.close();return 0; #define pb push_back #define fi first//printf("%lli\n",cur); #define se second//scanf("%lli",&n); using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int N = 2e5+5; struct node { int prior, val, mx, sz, l, r; }; vector<node> treap; vector<pair<int,int> > qu[N]; int nw(int val) { treap.pb({rand(),val,val,1,0,0}); return treap.size()-1; } void update(int node){ if(node == 0) return; int l = treap[node].l, r = treap[node].r; treap[node].mx = max({treap[node].val,treap[l].mx,treap[r].mx}); treap[node].sz = treap[l].sz+treap[r].sz+1; } int merg(int t1, int t2) { if(!t1||!t2) return (t1|t2); if(treap[t1].prior<treap[t2].prior) { treap[t1].r=merg(treap[t1].r,t2); update(t1); return t1; } else { treap[t2].l=merg(t1,treap[t2].l); update(t2); return t2; } } pair<int,int> splitbysize(int t, int k) { if(!t) return {0,0}; int l = treap[t].l, r = treap[t].r, sz = treap[l].sz; if(sz>=k) { pair<int,int> tt = splitbysize(l,k); treap[t].l=tt.se; update(t); return {tt.fi,t}; } else { pair<int,int> tt = splitbysize(r,k-treap[l].sz-1); treap[t].r=tt.fi; update(t); return {t,tt.se}; } } pair<int,int> splitbymax(int t, int val) { if(!t) return {0,0}; int l = treap[t].l, r = treap[t].r; if(treap[l].mx>val||treap[t].val>val) { pair<int,int> tt = splitbymax(l,val); treap[t].l=tt.se; update(t); return {tt.fi,t}; } else { pair<int,int> tt = splitbymax(r,val); treap[t].r=tt.fi; update(t); return {t,tt.se}; } } vector<int> make_op(vector<int> &a) { int n = a.size(); vector<int> ret; int it = 0, it2 = n/2; while(it<n/2||it2<n) { if(it==n/2) ret.pb(a[it2++]); else if(it2==n) ret.pb(a[it++]); else if(a[it]<a[it2]) ret.pb(a[it++]); else ret.pb(a[it2++]); } return ret; } void pr(int u) { if(u==0) return; pr(treap[u].l); cout << treap[u].val << " "; pr(treap[u].r); } int main() { // fio ifstream cin("in.in"); srand(6954); treap.pb({0,0,0,0,0,0}); int n, q, r = 1; cin >> n >> q; vector<int> a(n), ans(q); for(auto &x:a) cin >> x; for(int qi = 0;qi<q;qi++) { int t, x; cin >> t >> x; qu[min(t,N-1)].pb({x,qi}); } for(int i = 0;i<N;i++) { if(i==0) { for(auto x:qu[i]) ans[x.se]=a[x.fi-1]; a=make_op(a); r=nw(a[0]); for(int i = 1;i<n;i++) r=merg(r,nw(a[i])); } else { for(auto x:qu[i]) { auto t = splitbysize(r,x.fi); auto t2 = splitbysize(t.fi,x.fi-1); ans[x.se]=treap[t2.se].val; r=merg(t2.fi,merg(t2.se,t.se)); } auto t = splitbysize(r,n/2); while(treap[t.se].sz>1) { auto t1 = splitbysize(t.se,1); int val = treap[t1.fi].val; auto t2 = splitbymax(merg(t1.fi,t1.se),val); auto t3 = splitbymax(t.fi,val); t.fi=merg(merg(t3.fi,t2.fi),t3.se); t.se=t2.se; } r=merg(t.fi,t.se); } } for(auto x:ans) cout << x << "\n"; cin.close(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...