제출 #1175855

#제출 시각아이디문제언어결과실행 시간메모리
117585512345678케이크 (CEOI14_cake)C++20
0 / 100
363 ms5976 KiB
#include <bits/stdc++.h> using namespace std; const int nx=3e5+5; int n, a, h[nx], rid[nx], q, idx, e, t, b; vector<int> top; char opr; struct segtree { int mx[4*nx]; void build(int l, int r, int i) { if (l==r) return mx[i]=h[l], void(); int md=(l+r)/2; build(l, md ,2*i); build(md+1, r, 2*i+1); mx[i]=max(mx[2*i], mx[2*i+1]); } void update(int l, int r, int i, int idx, int vl) { if (idx<l||r<idx) return; if (l==r) return mx[i]=vl, void(); int md=(l+r)/2; update(l, md, 2*i, idx, vl); update(md+1, r, 2*i+1, idx, vl); mx[i]=max(mx[2*i], mx[2*i+1]); } int querymax(int l, int r, int i, int ql, int qr) { if (qr<l||r<ql) return 0; if (ql<=l&&r<=qr) return mx[i]; int md=(l+r)/2; return max(querymax(l, md ,2*i, ql, qr), querymax(md+1, r, 2*i+1, ql, qr)); } int getgreaterleft(int l, int r, int i, int idx, int vl) { if (idx<l||mx[i]<=vl) return -1; if (l==r) return l; int md=(l+r)/2; int rvl=getgreaterleft(md+1, r, 2*i+1, idx, vl); return (rvl==-1)?getgreaterleft(l, md, 2*i, idx, vl):rvl; } int getgreaterright(int l, int r, int i, int idx, int vl) { if (r<idx||mx[i]<=vl) return -1; if (l==r) return l; int md=(l+r)/2; int lvl=getgreaterright(l, md, 2*i, idx, vl); return (lvl==-1)?getgreaterright(md+1, r, 2*i+1, idx, vl):lvl; } } s; int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>a; t=n; for (int i=1; i<=n; i++) cin>>h[i], rid[h[i]]=i; h[0]=h[n+1]=1e9; s.build(0, n+1, 1); for (int i=n; i>n-10; i--) top.push_back(rid[i]); cin>>q; while (q--) { cin>>opr; if (opr=='E') { cin>>idx>>e; int f=0; for (auto x:top) if (x==idx) f=1; vector<int> nw; if (!f) top.pop_back(); else { vector<int> tmp; for (auto x:top) if (x!=idx) tmp.push_back(x); top=tmp; } for (int i=0; i<e-1; i++) nw.push_back(top[i]); nw.push_back(idx); for (int i=e; i<top.size(); i++) nw.push_back(top[i]); top=nw; for (int i=top.size()-1; i>=0; i--) s.update(0, n+1, 1, top[i], ++t); } else { cin>>b; if (a==b) cout<<"0\n"; else if (a<b) { int tmp=s.querymax(0, n+1, 1, a+1, b); cout<<b-s.getgreaterleft(0, n+1, 1, a-1, tmp)-1<<'\n'; } else { int tmp=s.querymax(0, n+1, 1, b, a-1); cout<<s.getgreaterright(0, n+1, 1, a+1, tmp)-b-1<<'\n'; } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...