Submission #587889

#TimeUsernameProblemLanguageResultExecution timeMemory
587889MohamedAliSaidaneBall Machine (BOI13_ballmachine)C++14
12.38 / 100
1098 ms27636 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; } bool comp(int a, int b) { if(d[a] > d[b] && jump(a, d[a] - d[b]) == b) return true; if(d[b] > d[a] && jump(b, d[b] - d[a]) == a) return false; if(mini[a] < mini[b]) 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; cout << 0 << '\n'; s.insert(cor[x]); } } } 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...