Submission #1307234

#TimeUsernameProblemLanguageResultExecution timeMemory
1307234simona1230Abracadabra (CEOI22_abracadabra)C++20
0 / 100
814 ms23976 KiB
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+5; int n,q; int a[maxn]; int p[1001][1001]; int t,x; void read() { cin>>n>>q; for(int i=1; i<=n; i++) { cin>>a[i]; p[0][i]=a[i]; } } int nxt[maxn]; void prec1() { for(int i=1; i<=n; i++) { int j=1; int i1=1,i2=n/2+1; while(i1<=n/2||i2<=n) { if(i1>n/2)p[i][j++]=p[i-1][i2++]; else if(i2>n)p[i][j++]=p[i-1][i1++]; else if(p[i-1][i1]<p[i-1][i2])p[i][j++]=p[i-1][i1++]; else p[i][j++]=p[i-1][i2++]; } } } void solve1() { for(int i=1; i<=q; i++) { int t,id; cin>>t>>id; cout<<p[min(n,t)][id]<<endl; } } struct group { int id; group() {} group(int _id) { id=_id; } bool operator<(const group&g)const { return a[id]<a[g.id]; } }; int b[maxn]; set<group> s; int sz[maxn]; void prec() { for(int i=1; i<=n; i++) b[i]=a[i]; stack<int> h; for(int i=n; i>=1; i--) { while(h.size()&&a[h.top()]<a[i])h.pop(); if(h.size())nxt[i]=h.top(); else nxt[i]=n+1; h.push(i); } int i=1; while(i<=n) { sz[i]=nxt[i]-i; s.insert({i}); i=nxt[i]; } } void solve() { cin>>t>>x; if(t==0) { cout<<b[x]<<endl; for(int i=2; i<=q; i++) { cin>>t>>x; cout<<b[x]<<endl; } return; } int br=-1; int cnt=0; auto it=s.begin(); while(cnt<n/2) { cnt+=sz[it->id]; if(cnt>n/2)br=it->id; else if(cnt<n/2)it++; } //cout<<"here"<<endl; int lp=0; while(br!=-1&&lp<t) { lp++; it=s.find({br}); group g=*it; int bf=cnt-sz[g.id]; int nid=n/2-bf+g.id; while(nid<g.id+sz[g.id]) { sz[nid]=nxt[nid]-nid; s.insert({nid}); nid=nxt[nid]; } s.erase({br}); sz[br]=n/2-bf; s.insert({br}); it=s.find(br); while(cnt>n/2) { cnt-=sz[it->id]; if(cnt==n/2)br=-1; else if(cnt<n/2)br=it->id; else it--; } if(br!=-1)cnt+=sz[br]; } int i=1; for(it=s.begin(); it!=s.end(); it++) { group g=*it; int j=sz[g.id]; //cout<<g.id<<" 0> "<<sz[g.id]<<endl; while(j--) { b[i++]=a[g.id]; g.id++; } } cout<<b[x]<<endl; for(int i=1; i<q; i++) { cin>>t>>x; cout<<b[x]<<endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); if(n<=1) { prec1(); solve1(); } else { prec(); solve(); } return 0; } /* 10 0 3 2 7 5 4 6 1 8 9 10 */ /* 8 8 5 2 7 3 1 6 8 4 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 8 8 5 2 7 3 1 6 8 4 3 1 1 3 2 6 3 3 5 3 4 2 3 5 7 3 6 3 3 7 8 3 8 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...