Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define optimizar ios_base::sync_with_stdio(0); cin.tie(0)
  3. #define lld long long int
  4. using namespace std;
  5. const int MAXN = 100002;
  6. const int LOG_N = 20;
  7.  
  8. int n, Q, root;
  9. vector < int > adj[MAXN];
  10. int depth[MAXN], padre[MAXN][LOG_N];
  11. set < int > libre;
  12. int id[MAXN], realNum[MAXN];
  13.  
  14. int cont;
  15. void dfs(int v) {
  16. depth[v] = depth[padre[v][0]] + 1;
  17. for(int i = 1; i < LOG_N; i++)
  18. padre[v][i] = padre[padre[v][i - 1]][i - 1];
  19.  
  20. for(int i = 0; i < adj[v].size(); i++) dfs(adj[v][i]);
  21. id[v] = ++cont;
  22. realNum[cont] = v;
  23. }
  24.  
  25. int erase(int v) {
  26. int u = v;
  27. for(int i = LOG_N - 1; i >= 0; i--) {
  28. if(!libre.count(id[padre[u][i]]) && padre[u][i])
  29. u = padre[u][i];
  30. }
  31. libre.insert(id[u]);
  32. return depth[v] - depth[u];
  33. }
  34.  
  35. int main() {
  36. ios_base::sync_with_stdio(0); cin.tie(0);
  37. cin >> n >> Q;
  38. for(int i = 1; i <= n; i++) {
  39. libre.insert(i);
  40. int p;
  41. cin >> p;
  42. if(!p) root = i;
  43. else {
  44. padre[i][0] = p;
  45. adj[p].push_back(i);
  46. }
  47. }
  48. for(int i = 1; i <= n; i++) sort(adj[i].begin(), adj[i].end());
  49. dfs(root);
  50.  
  51. int last = 0;
  52. for(int i = 1; i <= Q; i++) {
  53. int a, b;
  54. cin >> a >> b;
  55. if(a == 1) {
  56. for(int j = 1; j <= b; j++) {
  57. set < int > :: iterator it = libre.begin();
  58. last = realNum[*it];
  59. cout << "add to " << last << "\n";
  60. libre.erase(*it);
  61. }
  62. cout << last << "\n";
  63. } else {
  64. cout << erase(b) << "\n";
  65. }
  66. }
  67. return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement