#include<bits/stdc++.h>
using namespace std;
#define int long long
using pis=pair<int,string>;
using ll=long long;
#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(),x.end()
const int N=2001;
string name[N]; int cnt;
vector<pis>ele[N];
int siz[N],base[N];
pis var[N]; int tot;
int pos[N];
int find1(string n){
for(int i=1;i<=tot;++i) {
if(var[i].se==n) return i;
}
return 0;
}
pis find2(int type,string s,int&ps){
for(auto[x,s1]:ele[type]){
if(s1==s) {
if(ps%base[x]) ps=base[x]*(ps/base[x]+1);
return {x,s1};
}
if((ps+=siz[x])%base[x]) ps=(ps/base[x]+1)*base[x];
}
return {-1,""};
}
string str(string x,int l,int r){
string res;
for(int i=l;i<r;++i) res+=x[i];
return res;
}
string dfs(int,int,const int);
main(){
cin.tie(0)->sync_with_stdio(0);
name[1]="byte",name[2]="short",name[3]="int",name[4]="long";
siz[1]=1,siz[2]=2,siz[3]=4,siz[4]=8;
base[1]=1,base[2]=2,base[3]=4,base[4]=8; cnt=4;
int n; cin>>n;
for(int op;n--;){
cin>>op;
if(op==1){
string s; int k;
cin>>s>>k; name[++cnt]=s;
for(string s1,s2;k--;){
cin>>s1>>s2;
int ps=find(name+1,name+cnt+1,s1)-name;
ele[cnt].pb({ps,s2});
}
int mx=0,sz=0;
for(auto[x,ss]:ele[cnt])
if(base[x]>base[mx]) mx=x;
mx=base[mx];
for(auto[x,ss]:ele[cnt])
if((sz+=siz[x])%base[x]) sz=(sz/base[x]+1)*base[x];
if(sz%mx) sz=(sz/mx+1)*mx;
siz[cnt]=sz,base[cnt]=mx;
cout<<sz<<' '<<mx<<'\n';
}
if(op==2){
string t,n; cin>>t>>n;
int ps=find(name+1,name+cnt+1,t)-name;
pos[tot+1]=pos[tot]+siz[ps];
int bas=base[ps];
if(pos[tot]%bas)
pos[tot+1]=(pos[tot+1]/bas+1)*bas;
cout<<pos[tot++]<<'\n';
var[tot]={ps,n};
}
if(op==3){
string s; cin>>s; int l=0,len=s.size();
for(;l<len&&s[l]^'.';++l);
if(l==len) {cout<<pos[find1(str(s,0,l))-1]<<'\n';continue;}
int ps=find1(str(s,0,l)),pp=pos[ps-1],T=var[ps].fi;
++l;
for(int l1;;l=l1+1){
for(l1=l;l1<len&&s[l1]^'.';++l1);
pis varp=find2(T,str(s,l,l1),pp);
if(l1==len) {cout<<pp<<'\n'; break;}
T=varp.fi;
}
}
if(op==4){
int addr,ps=1; cin>>addr;
if(addr>=pos[tot]){ cout<<"ERR\n"; continue;}
for(;ps<=tot;++ps)
if(addr>=pos[ps-1]&&addr<pos[ps]) break;
int ps1=pos[ps-1],typ=var[ps].fi;
if(typ<=4) {cout<<var[ps].se<<'\n'; continue;}
string res=dfs(ps1,typ,addr);
if(res=="ERR\n"){ cout<<res; continue;}
cout<<var[ps].se+'.'+dfs(ps1,typ,addr)<<'\n';
}
_:;
}
}
const string fail="ERR\n";
string dfs(int ps,int T,const int addr){
int bgp=ps;
for(int i=0;i<ele[T].size();++i){
auto[x,s1]=ele[T][i];
ps+=siz[x];
if(ps<=addr){
if(ps%base[x])
if((ps=base[x]*(ps/base[x]+1))>addr) return"ERR\n";
} else {
if(x<=4) return s1;
string res=dfs(ps-siz[x],x,addr);
if(res==fail) return res;
return s1+'.'+res;
}
}
return"ERR\n";
}