Submission #57892

#TimeUsernameProblemLanguageResultExecution timeMemory
57892thiago4532Cake (CEOI14_cake)C++17
0 / 100
2082 ms15496 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 250010; int vet[maxn], bak[maxn], mark[maxn]; struct node{ int v, w, sz, maior; node *l, *r; node(int v=0): w(rand()), maior(v), v(v), l(0), r(0) { } }; inline int maior(node* t){ return t ? t->maior : 0; } inline int sz(node *t){ return t ? t->sz : 0; } inline void update(node*& t){ if(!t) return; t->sz = sz(t->l) + sz(t->r) + 1; t->maior = max(t->v, max(maior(t->l), maior(t->r))); } void merge(node*& t, node* l, node *r){ if(!l || !r) return void(t = l?l:r); if(l->w >= r->w){ merge(l->r, l->r, r); t = l; }else{ merge(r->l, l, r->l); t = r; } update(t); } void split(node *t, node*& l, node*& r, int p){ if(!t) return void(l = r = 0); int pos = sz(t->l) + 1; if(pos < p){ l = t; split(t->r, t->r, r, p-pos); }else{ r = t; split(t->l, l, t->l, p); } update(t); } void insert(node*& t, int pos, int v){ node *l=0, *r=0, *it = new node(v); split(t, l, r, pos); merge(l, l, it); merge(t, l, r); } void erase(node*& t, int pos){ node *l=0, *r=0, *aux; split(t, l, r, pos); split(r, aux, r, 2); merge(t, l, r); delete aux; } void altera(node*& t, int p, int v){ if(!t) return; int pos = sz(t->l) + 1; if(pos == p) t->v = v; else if(p < pos) altera(t->l, p, v); else altera(t->r, p-pos, v); update(t); } ostream& operator<<(ostream& out, node *t){ if(!t) return out; out << t->l << t->v << " " << t->r; } int query1(node *t, int v, int p=0){ if(!t) return 0; int pos = sz(t->l) + 1 + p; if(maior(t->l) >= v) return query1(t->l, v, p); else if(t->v >= v) return pos; else return query1(t->r, v, pos); } int query2(node *t, int v, int p=0){ if(!t) return 0; int pos = sz(t->l) + 1 + p; if(maior(t->r) >= v) return query2(t->r, v, pos); else if(t->v >= v) return pos; else return query2(t->l, v, p); } inline int ans_query1(node*& t, int p, int v){ node *l=0, *r=0; split(t, l, r, p); int resp = query1(r, v); //cout << r << "- " << resp << "\n"; merge(t, l, r); return resp; } inline int ans_query2(node*& t, int p, int v){ node *l=0, *r=0; split(t, l, r, p); int resp = query2(l, v); //cout << l << "- " << resp << "\n"; merge(t, l, r); return resp; } typedef pair<int, int> pii; #define ff first #define ss second int main(){ ios::sync_with_stdio(false), cin.tie(0); int n, a; cin >> n >> a; node *no = 0; for(int i=1;i<=n;i++) cin >> vet[i], insert(no, i, vet[i]); int q; cin >> q; while(q--){ char c; cin >> c; if(c == 'F'){ int x; cin >> x; int ans = abs(x - a); int o = (x - a > 0 ? -1 : 1); int maior = vet[x]; if(x - a == 0){ cout << ans << "\n"; continue; } int p = a + o; if(x - a > 0) for(int i=a+1;i<=x;i++) maior = max(maior, vet[i]); else for(int i=x;i<a;i++) maior = max(maior, vet[i]); //if(o == 1) cout << "QUERY1: " << ans_query1(no, p, maior) << "\n" ; //else cout << "QUERY2: " << ans_query2(no, p+1, maior) << "\n"; //cout << "MAX: " << maior << "\n"; /*while(p >= 1 && p <= n){ //cout << p << " " << vet[p] << "\n"; if(vet[p] > maior) break; ans++; p += o; }*/ if(o == 1){ int y = ans_query1(no, p, maior); //cout << "Y: " << y << "\n"; if(y == 0) ans += (n-a); else ans += (y-1); } else{ int y = ans_query2(no, p+1, maior); if(y == 0) ans += x; else ans += (a-y-1); } cout << ans << "\n"; }else{ int p, e; cin >> p >> e; e = n - e + 1; for(int i=1;i<=n;i++) bak[i] = vet[i]; nth_element(bak+1, bak+e, bak+1+n); vet[p] = bak[e]+1; altera(no, p, vet[p]); for(int i=1;i<=n;i++) if(i != p && vet[i] >= vet[p]) vet[i]++, altera(no, i, vet[i]); } } return 0; }

Compilation message (stderr)

cake.cpp: In constructor 'node::node(int)':
cake.cpp:8:16: warning: 'node::maior' will be initialized after [-Wreorder]
  int v, w, sz, maior;
                ^~~~~
cake.cpp:8:6: warning:   'int node::v' [-Wreorder]
  int v, w, sz, maior;
      ^
cake.cpp:11:2: warning:   when initialized here [-Wreorder]
  node(int v=0): w(rand()), maior(v), v(v), l(0), r(0) { }
  ^~~~
cake.cpp: In function 'std::ostream& operator<<(std::ostream&, node*)':
cake.cpp:85:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...