Submission #1096803

#TimeUsernameProblemLanguageResultExecution timeMemory
1096803tosivanmakAbracadabra (CEOI22_abracadabra)C++17
100 / 100
702 ms77216 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long struct qry{ ll t,i,qid; bool operator<(const qry& qr)const{ if(t!=qr.t)return t<qr.t; if(i!=qr.i)return i<qr.i; return qid<qr.qid; } }; struct SEG{ vector<pair<ll,ll> >seg; vector<ll>cnt; ll _n; void init(ll n){ _n=n; seg.resize(4*n+5); cnt.resize(4*n+5,0); } void upd(ll ul, ll l, ll r, pair<ll,ll>val, ll id){ if(l==r){ seg[id]=val; cnt[id]=val.second-val.first+1; return; } ll mid=(l+r)>>1; if(ul<=mid) upd(ul,l,mid,val,id*2); else upd(ul,mid+1,r,val,id*2+1); cnt[id]=cnt[id*2]+cnt[id*2+1]; } ll bs(ll l, ll r, ll k, ll id){ if(l==r) return l; ll mid=(l+r)>>1; if(cnt[id*2]>=k) return bs(l,mid,k,id*2); else return bs(mid+1,r,k-cnt[id*2],id*2+1); } pair<ll,ll> pairfinding(ll ul, ll l, ll r, ll id){ if(l==r){ return seg[id]; } else{ ll mid=(l+r)>>1; if(ul<=mid){ return pairfinding(ul,l,mid,id*2); } else return pairfinding(ul,mid+1,r,id*2+1); } } ll sum(ll ql, ll qr, ll l, ll r, ll id){ if(l>qr||r<ql)return 0; if(l>=ql&&r<=qr)return cnt[id]; ll mid=(l+r)>>1; return sum(ql,qr,l,mid,id*2)+sum(ql,qr,mid+1,r,id*2+1); } ll find(){ return bs(1,_n,_n/2+1,1); } }st; ll n; ll nxt[200005]; ll a[200005]; void start_shuffle(){ ll cur=st.find(); ll tot=st.sum(1,cur,1,n,1); pair<ll,ll>rng=st.pairfinding(cur,1,n,1); ll rngsum=rng.second-rng.first+1; if(tot-rngsum==n/2) return; tot-=rngsum; ll diff=n/2-tot; pair<ll,ll>bruh={rng.first,rng.first+diff-1}; st.upd(cur,1,n,bruh,1); ll curid=bruh.second+1; while(1){ if(nxt[curid]>rng.second){ st.upd(a[curid],1,n,{curid,rng.second},1);break; } else{ st.upd(a[curid],1,n,{curid,nxt[curid]-1},1); curid=nxt[curid]; } } } ll find_id(ll idd){ ll cur=st.bs(1,n,idd,1); pair<ll,ll>rng=st.pairfinding(cur,1,n,1); ll tot=st.sum(1,cur,1,n,1); ll rngsum=rng.second-rng.first+1; tot-=rngsum; return a[rng.first+idd-tot-1]; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll q; cin>>n>>q; st.init(n); for(int i=1;i<=n;i++)cin>>a[i]; vector<qry>qrs; int cnt=1; while(q--){ ll t,i; cin>>t>>i; t=min(t,n); qrs.push_back({t,i,cnt}); cnt++; } sort(qrs.begin(),qrs.end()); ll shuffles=0; ll ans[qrs.size()+5]; ll newarr[n+5]; newarr[0]=0; for(int i=1;i<=n;i++){ newarr[i]=max(newarr[i-1],a[i]); } ll ptr=1; for(int i=1;i<=n;i++){ if(newarr[i]!=newarr[i-1]){ st.upd(newarr[i-1],1,n,{ptr,i-1},1); ptr=i; } } st.upd(newarr[n],1,n,{ptr,n},1); stack<pair<ll,ll> >s; for(int i=1;i<=n;i++){ while(s.size()){ if(a[i]>s.top().second){ nxt[s.top().first]=i; s.pop(); } else break; } s.push({i,a[i]}); } while(s.size()){ nxt[s.top().first]=300000; s.pop(); } for(int i=0;i<qrs.size();i++){ while(shuffles<qrs[i].t){ shuffles++; start_shuffle(); } ans[qrs[i].qid]=find_id(qrs[i].i); } for(int i=1;i<=cnt-1;i++){ cout<<ans[i]<<'\n'; } }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:141:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<qry>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |     for(int i=0;i<qrs.size();i++){
      |                 ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...