제출 #587895

#제출 시각아이디문제언어결과실행 시간메모리
587895MohamedAliSaidaneBall Machine (BOI13_ballmachine)C++14
100 / 100
913 ms27848 KiB
#include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; typedef tree<int,null_type,less<int>,rb_tree_tag, tree_order_statistics_node_update> indexed_set; typedef long long ll; typedef long double ld; ///#define int ll typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef pair<ld,ld> pld; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<pii> vpi; typedef vector<pll> vpl; #define pb push_back #define popb pop_back #define pp pop_back #define pf push_front #define popf pop_front #define all(x) (x).begin(),(x).end() #define ff first #define ss second int nx[4] = {0,0,1,-1}, ny[4] = {1,-1,0,0}; ll gcd(ll a , ll b) {return b ? gcd(b , a % b) : a ;} ll lcm(ll a , ll b) {return (a * b) / gcd(a , b);} const ll MOD = 998244353; const int nax = 1e5 + 4; int n, q; vi adj[nax]; int sp[nax][20], d[nax], mini[nax]; int root = 1; void dfs(int x, int p) { d[x] = d[p] + 1; sp[x][0] = p; mini[x] = x; for(auto e: adj[x]) { if(e != p) { dfs(e,x); mini[x] = min(mini[x], mini[e]); } } } void build() { for(int j= 1; j < 20; j ++) for(int i= 1 ; i <= n ;i ++) sp[i][j] = sp[sp[i][j - 1]][j - 1]; } int jump(int a, int k) { for(int i = 0; i < 20; i ++) if((1 << i) & k) a = sp[a][i]; return a; } int lca(int a, int b) { if(d[a] < d[b]) swap(a,b); a = jump(a, d[a] - d[b]); if(a == b) return a; for(int i = 19 ; i >= 0; i--) if(sp[a][i] != sp[b][i]) a = sp[a][i], b = sp[b][i]; return sp[a][0]; } bool comp(int a, int b) { int c = lca(a,b); if(c == a) return false; else if(c == b) return true; int d1 = d[a] - d[c] - 1; int d2 = d[b] - d[c] - 1; int p1 = jump(a,d1); int p2 = jump(b,d2); if(mini[p1] < mini[p2]) return true; else return false; } void solve() { cin >> n >> q; for(int i= 1; i <= n ;i ++) { int x; cin >> x; if(x == 0) root = i; else { adj[x].pb(i); adj[i].pb(x); } } d[0] = -1; dfs(root,0); build(); vi nodes; for(int i= 1; i <= n ;i ++) nodes.pb(i); sort(all(nodes),comp); set<int> s; for(int i = 0; i < n; i ++) s.insert(i); int cor[n + 1]; for(int i = 0; i < n ; i ++) cor[nodes[i]] = i; while(q--) { int type; cin >> type; if(type == 1) { int k; cin >> k; for(int i = 1;i < k; i ++) s.erase(s.begin()); int idx = *(s.begin()); cout << nodes[idx] << '\n'; s.erase(s.begin()); } else { int x; cin >> x; int debut = 1; int fin = d[x]; int rep = 0; while(debut <= fin) { int mid = (debut + fin)/2; if(s.count(cor[jump(x,mid)]) == 0) { rep = mid; debut= mid + 1; } else fin = mid - 1; } s.insert(cor[jump(x,rep)]); cout << rep << '\n'; } } } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt = 1; //cin >> tt; while(tt --) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...