#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=105;
int n,cnt,k[maxn],tot,o[maxn][maxn],sta[maxn][maxn],len[maxn][maxn],a[maxn][maxn],num[maxn],A[maxn],St[maxn];
string s,st[maxn][maxn],op[maxn],Op[maxn][maxn],q[maxn];
map<string,int>Id,id,ID[maxn];
int read(){
int ret=0,y=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') y=-y;ch=getchar();}
while(isdigit(ch)) ret=(ret<<1)+(ret<<3)+(ch&15),ch=getchar();
return ret*y;
}
signed main(){
n=read();num[1]=1;num[2]=2;num[3]=4;num[4]=8;cnt=4;
Id["byte"]=1;Id["short"]=2;Id["int"]=3;Id["long"]=4;
A[1]=1;A[2]=2;A[3]=4;A[4]=8;
while(n--){
int opt=read();
if(opt==1){
cin>>s;k[cnt+1]=read();cnt++;int Maxlen=0,Maxa=0;
for(int i=1;i<=k[cnt];i++){
cin>>Op[cnt][i]>>st[cnt][i];
ID[cnt][st[cnt][i]]=i;
len[cnt][i]=num[Id[Op[cnt][i]]];
a[cnt][i]=A[Id[Op[cnt][i]]];
Maxa=max(Maxa,a[cnt][i]=A[Id[Op[cnt][i]]]);
}
A[cnt]=Maxa;
o[cnt][1]=0;
for(int i=2;i<=k[cnt];i++){
int L=o[cnt][i-1]+len[cnt][i-1];
o[cnt][i]=((L+a[cnt][i]-1)/a[cnt][i])*a[cnt][i];
}
num[cnt]=((o[cnt][k[cnt]]+len[cnt][k[cnt]]+A[cnt]-1)/A[cnt])*A[cnt];
Id[s]=cnt;
printf("%lld %lld\n",num[cnt],A[cnt]);
}else if(opt==2){
cin>>op[++tot]>>q[tot];id[q[tot]]=tot;
if(tot==1) St[tot]=0;
else{
St[tot]=((St[tot-1]+num[Id[op[tot-1]]]+A[Id[op[tot]]]-1)/A[Id[op[tot]]])*A[Id[op[tot]]];
}
printf("%lld\n",St[tot]);
}else if(opt==3){
string now;int ans=0,nowid=0;
cin>>now;int s_size=now.size();bool flg=0;
for(int i=0;i<s_size;i++){
string nw="";
int j=i;
while(j<s_size&&now[j]!='.') nw=nw+now[j],j++;
int K;
if(!flg){
K=id[nw];
nowid=Id[op[K]];
ans=St[K];
flg=1;
}else{
for(int i=1;i<=k[nowid];i++){
if(st[nowid][i]==nw){
ans+=o[nowid][i];
nowid=Id[Op[nowid][i]];
break;
}
}
}
i=j;
}
printf("%lld\n",ans);
}else{
int now=read();
int L_=1,R_=tot,Now=0;bool flg=1;
string ans="";
while(L_<=R_){
int mid=L_+R_>>1;
if(St[mid]<=now&&now<=St[mid]+num[Id[op[mid]]]){Now=Id[op[mid]];ans=q[mid];now-=St[mid];break;}
if(St[mid]+num[Id[op[mid]]]<=now&&now<St[mid+1]){flg=0;break;}
if(now<St[mid]) R_=mid-1;
else L_=mid+1;
}
if(!flg){puts("ERR");continue;}
if(!Now){puts("ERR");continue;}
while(Now>4){
L_=1;R_=k[Now];bool tag=0;
while(L_<=R_){
int mid=L_+R_>>1;
if(o[Now][mid]<=now&&now<o[Now][mid]+num[Id[Op[Now][mid]]]){
now-=o[Now][mid];
ans=ans+"."+st[Now][mid];
Now=Id[Op[Now][mid]];
tag=1;break;
}
if(o[Now][mid+1]>now&&now>=o[Now][mid]+num[Id[Op[Now][mid]]]){flg=0;break;}
if(now<o[Now][mid]) R_=mid-1;
else L_=mid+1;
}
if(!tag){flg=0;break;}
if(!flg) break;
}
if(!flg){puts("ERR");continue;}
if(now>=num[Now]) puts("ERR");
else cout<<ans<<'\n';
}
}
return 0;
}