제출 #968920

#제출 시각아이디문제언어결과실행 시간메모리
968920NintsiChkhaidzeBall Machine (BOI13_ballmachine)C++17
100 / 100
440 ms39108 KiB
#include <bits/stdc++.h> #define ll long long #define s second #define f first #define pb push_back #define left (h*2),l,(l + r)/2 #define right (h*2+1),(l+r)/2 + 1,r #define pii pair <int,int> using namespace std; const int N = 1e5 + 5; vector <int> v[N]; int ord[N],mn[N],sub[N]; int pr[N],fix[N],d[25][N],t[4*N],id[N]; int lz[4*N],dep[N]; void predfs(int x,int par){ mn[x] = x; dep[x] = dep[par] + 1; d[0][x] = par; sub[x] = 1; for (int to: v[x]){ if (to == par) continue; predfs(to,x); mn[x] = min(mn[x],mn[to]); sub[x] += sub[to]; } } void dfs(int x,int par,int l,int r){ vector <pii> vec; for (int to: v[x]){ if (to != par) vec.pb({mn[to],to}); } sort(vec.begin(),vec.end()); int L = l; for (auto [p,to]: vec){ dfs(to,x,L,L + sub[to] - 1); L += sub[to]; } ord[r] = x; } void build(int h,int l,int r){ lz[h] = -1; if (l == r){ t[h] = 0; return; } build(left); build(right); t[h] = t[h*2] + t[h*2 + 1]; } void push(int h,int l,int r){ if (lz[h] == -1) return; lz[h*2] = lz[h*2+ 1] = lz[h]; t[h*2] = ((r + l)/2 - l + 1)*lz[h]; t[h*2 + 1] = (r - (r + l)/2)*lz[h]; lz[h] = -1; } int findk(int h,int l,int r,int k){ if (l == r) return l; push(h,l,r); int lft = (l + r)/2 - l + 1 - t[h*2]; if (lft >= k) return findk(left,k); return findk(right,k - lft); } void upd(int h,int l,int r,int L,int R,int vl){ if (r < L || R < l) return; if (L <= l && r <= R){ t[h] = vl * (r - l + 1); lz[h] = vl; return; } push(h,l,r); upd(left,L,R,vl); upd(right,L,R,vl); t[h] = t[h*2] + t[h*2 + 1]; } int get(int h,int l,int r,int idx){ if (l == r) return t[h]; push(h,l,r); if (idx > (l + r)/2) return get(right,idx); return get(left,idx); } signed main(){ ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL); int n,q,root; cin>>n>>q; for (int i = 1; i <= n; i++){ int p; cin>>p; if (!p) root=i; else { pr[i] = p; v[p].pb(i); v[i].pb(p); } } predfs(root,root); dfs(root,root,1,n); for (int i = 1; i <= n; i++) id[ord[i]] = i; build(1,1,n); for (int i = 1; i <= 18; i++) for (int j = 1; j <= n; j++) d[i][j] = d[i - 1][d[i - 1][j]]; while (q--){ int tp,x; cin>>tp>>x; if (tp == 1){ int len = findk(1,1,n,x); // me-x nuli vipovot upd(1,1,n,1,len,1); cout<<ord[len]<<endl; continue; } int y = x,len = 0; for (int i = 18; i >= 0; i--){ if (dep[y] > (1<<i) && get(1,1,n,id[d[i][y]])) { len += (1<<i); y = d[i][y]; } } upd(1,1,n,id[y],id[y],0); cout<<len<<endl; } }

컴파일 시 표준 에러 (stderr) 메시지

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:114:5: warning: 'root' may be used uninitialized in this function [-Wmaybe-uninitialized]
  114 |  dfs(root,root,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...