#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 105;
int op,k,addr;
string s,t,n;
struct node{
string name;
int len,size;
int k,it[N];
string it_s[N];
}a[N];
int pre = 4;
map<string,int > tt;
int len = 0;
struct point{
string name;
int idx; // node
int l,r;
}b[N];
map<string,int > nn;
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
tt["byte"] = 1;
tt["short"] = 2;
tt["int"] = 3;
tt["long"] = 4;
a[1] = {"byte",1,1,0,{0},{""}};
a[2] = {"short",2,2,0,{0},{""}};
a[3] = {"int",4,4,0,{0},{""}};
a[4] = {"long",8,8,0,{0},{""}};
b[0].r = -1;
int T;
cin >> T;
while(T--){
cin >> op;
if(op == 1){
cin >> s >> k;
pre++;
tt[s] = pre;
a[pre].name = s;
a[pre].k = k;
int size=0,len=0;
for(int i = 1; i <= k; i++){
cin >> t >> n;
a[pre].it[i] = tt[t];
a[pre].it_s[i] = n;
len = max(len,a[a[pre].it[i]].len);
size = ((size%a[a[pre].it[i]].len==0?0:1)+size/a[a[pre].it[i]].len+1)*a[a[pre].it[i]].len;
}
a[pre].len = len;
a[pre].size = size;
cout << size << ' ' << len << '\n';
}else if(op == 2){
cin >> t >> n;
len++;
nn[n] = len;
b[len].name = n;
b[len].idx = tt[t];
int lv = a[b[len].idx].len;
if(len == 1){
b[len].l = 0;
b[len].r = a[b[len].idx].size - 1;
}else{
int size = a[b[len].idx].size;
b[len].l = (((b[len-1].r+1)%size==0?0:1)+(b[len-1].r+1)/size)*size;
b[len].r = b[len].l-1+size;
}
cout << b[len].l << '\n';
}else if(op == 3){
cin >> s;
if(s.find('.') == -1){
cout << b[nn[s]].l << '\n';
continue;
}
int res = 0;
int fi = s.find('.');
string na = s.substr(0,fi);
s.erase(0,fi+1);
res = b[nn[na]].l;
int ind = b[nn[na]].idx;
res++;
while(s.find('.') != -1){
int fi = s.find('.');
na = s.substr(0,fi);
s.erase(0,fi+1);
for(int i = 1; i <= a[ind].k; i++){
if(a[ind].it_s[i] != na){
res = ((res%a[a[ind].it[i]].size==0?0:1)+res/a[a[ind].it[i]].size)*a[a[ind].it[i]].size;
}
ind = a[ind].it[i];
break;
}
}
for(int i = 1; i <= a[ind].k; i++){
if(a[ind].it_s[i] != na){
res = ((res%a[a[ind].it[i]].size==0?0:1)+res/a[a[ind].it[i]].size)*a[a[ind].it[i]].size;
}
}
cout << res << '\n';
}else{
cin >> addr;
if(addr > b[len].r){
cout << "ERR\n";
continue;
}
string ans = "";
bool wind_kaka = true;
for(int i = 1; i <= len; i++){
if(b[i].l <= addr && addr <= b[i].r){
if(b[i].idx <= 4){
wind_kaka = false;
ans += b[i].name;
break;
}else{
ans = b[i].name + '.';
int now = b[i].l;
int idx = b[i].idx;
while(idx > 4 && wind_kaka){
for(int i = 1; i <= a[idx].k; i++){
// cout << i << " ";
int ppp = ((now%a[a[idx].it[i]].size==0?0:1)+now/a[a[idx].it[i]].size+1)*a[a[idx].it[i]].size;
// cout << ppp << ' ';
if(ppp >= addr){
if(a[idx].it[i]<= 4){
ans = ans + a[idx].it_s[i];
wind_kaka = false;
break;
}
ans = ans + b[i].name + '.';
idx = a[idx].it[i];
break;
}
now = ppp;
}
break;
}
}
break;
}
}
if(wind_kaka) cout << "ERR\n";
else cout << ans << '\n';
}
}
return 0;
}
op = 4 处理肯定有问题