#include <iostream>
#include <unordered_map>
using namespace std;
struct Node {
int val;
Node* next;
Node(int x) : val(x), next(nullptr) {}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
Node* head = new Node(1);
unordered_map<int, Node*> nodeMap;
nodeMap[1] = head;
int q;
cin >> q;
while (q--) {
int op, x, y;
cin >> op;
if (op == 1) {
cin >> x >> y;
Node* newNode = new Node(y);
nodeMap[y] = newNode;
newNode->next = nodeMap[x]->next;
nodeMap[x]->next = newNode;
}
else if (op == 2) {
cin >> x;
Node* nextNode = nodeMap[x]->next;
cout << (nextNode ? nextNode->val : 0) << '\n';
}
else if (op == 3) {
cin >> x;
Node* toDelete = nodeMap[x]->next;
if (toDelete) {
nodeMap[x]->next = toDelete->next;
nodeMap.erase(toDelete->val);
delete toDelete;
}
}
}
Node* curr = head;
while (curr) {
Node* temp = curr;
curr = curr->next;
delete temp;
}
return 0;
}