제출 #449893

#제출 시각아이디문제언어결과실행 시간메모리
449893vanic케이크 (CEOI14_cake)C++14
0 / 100
2098 ms72076 KiB
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> using namespace std; const int maxn=3e5, Log=18, pot=(1<<Log); struct tournament{ int t[pot*2]; void gradi(){ for(int i=pot-1; i>0; i--){ t[i]=max(t[i*2], t[i*2+1]); } } void update(int x, int val){ t[x]=val; for(x>>=2; x; x>>=2){ t[x]=max(t[x*2], t[x*2+1]); } } int query(int L, int D, int x, int l, int d){ if(L>=l && D<=d){ return t[x]; } int lijeva=0, desna=0; if((L+D)/2>=l){ lijeva=query(L, (L+D)/2, x*2, l, d); } if((L+D)/2+1<=d){ desna=query((L+D)/2+1, D, x*2+1, l, d); } return max(lijeva, desna); } int nadji(int L, int D, int x, int l, int d, int val, bool s){ if(L>=l && D<=d){ int pos=x; while(pos<pot && t[pos]>val){ if(s){ if(t[pos*2]>val){ pos*=2; } else{ pos=pos*2+1; } } else{ if(t[pos*2+1]>val){ pos=pos*2+1; } else{ pos*=2; } } } if(t[pos]>val){ return pos-pot; } return -1; } int p=-1; if(s){ if((L+D)/2>=l){ p=nadji(L, (L+D)/2, x*2, l, d, val, s); if(p!=-1){ return p; } } if((L+D)/2+1<=d){ p=nadji((L+D)/2+1, D, x*2+1, l, d, val, s); } } else{ if((L+D)/2+1<=d){ p=nadji((L+D)/2+1, D, x*2+1, l, d, val, s); if(p!=-1){ return p; } } if((L+D)/2>=l){ p=nadji(L, (L+D)/2, x*2, l, d, val, s); } } return p; } }; tournament T; vector < pair < int, int > > upd; bool cmp(pair < int, int > x, pair < int, int > y){ return x.first>y.first; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, x; cin >> n >> x; x--; int a; for(int i=0; i<n; i++){ cin >> a; if(a>n-10){ a=(a-n+10)*1e6; upd.push_back({a, i}); } T.t[i+pot]=a; // cout << a << ' '; } // cout << '\n'; T.gradi(); sort(upd.begin(), upd.end(), cmp); int q; cin >> q; char c; int e, f; int novi, stari; int val1, val2; int tren=n+1; for(int i=0; i<q; i++){ cin >> c >> e; e--; if(c=='F'){ if(e==x){ cout << 0 << '\n'; continue; } else if(e>x){ val1=T.query(0, pot-1, 1, x+1, e); if(x){ val2=T.nadji(0, pot-1, 1, 0, x-1, val1, 0); } else{ val2=-1; } cout << e-val2-1 << '\n'; } else{ val1=T.query(0, pot-1, 1, e, x-1); val2=T.nadji(0, pot-1, 1, x+1, pot-1, val1, 1); if(val2==-1){ val2=n; } cout << val2-e-1 << '\n'; } } else{ cin >> f; f--; novi=e; int ind=-1; for(int j=0; j<(int)upd.size(); j++){ if(upd[j].second==e){ ind=j; break; } } if(ind==-1){ for(int j=f; j<(int)upd.size(); j++){ T.update(novi+pot, upd[j].first); stari=novi; novi=upd[j].second; upd[j].second=stari; } T.update(novi+pot, tren); tren++; } else if(ind>f){ for(int j=f; j<=ind; j++){ T.update(novi+pot, upd[j].first); stari=novi; novi=upd[j].second; upd[j].second=stari; } } else if(ind<f){ for(int j=f; j>=ind; j--){ T.update(novi+pot, upd[j].first); stari=novi; novi=upd[j].second; upd[j].second=stari; } } cout << "novi "; for(int j=0; j<n; j++){ cout << T.query(0, pot-1, 1, j, j) << ' '; } cout << endl; } } 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...