#include<bits/stdc++.h>
using namespace std;
#define MAXN 105
#define int long long
int n,cz,tot=3,inctot,incsum;
struct Node{
string name;
int k,maxsize,sum;
map<string,int>incmp;
struct INC{
string n;
int t,l,r,s,ms;
}inc[MAXN];
}node[MAXN];
map<string,int>strmp;
map<string,int>namemp;
struct INC{
string n;
int t,l,r,ms,s;
}inc[MAXN];
signed main(){
scanf("%lld",&n);
strmp["byte"]=0,node[0].maxsize=1,node[0].sum=1;
strmp["short"]=1,node[1].maxsize=2,node[1].sum=2;
strmp["int"]=2,node[2].maxsize=4,node[2].sum=4;
strmp["long"]=3,node[3].maxsize=8,node[3].sum=8;
for(int I=0;I<n;I++){
scanf("%lld",&cz);
if(cz==1){
cin>>node[++tot].name;
scanf("%lld",&node[tot].k);
strmp[node[tot].name]=tot;
node[tot].sum=0;
for(int i=0;i<node[tot].k;i++){
string t;
cin>>t>>node[tot].inc[i].n;
node[tot].inc[i].t=strmp[t];
node[tot].inc[i].ms=node[node[tot].inc[i].t].maxsize;
node[tot].inc[i].s=node[node[tot].inc[i].t].sum;
node[tot].maxsize=max(node[tot].maxsize,node[tot].inc[i].ms);
node[tot].inc[i].l=((node[tot].sum+node[tot].inc[i].ms-1)/node[tot].inc[i].ms)*node[tot].inc[i].ms;
node[tot].inc[i].r=node[tot].inc[i].l+node[tot].inc[i].s-1;
node[tot].sum=node[tot].inc[i].r+1;
node[tot].incmp[node[tot].inc[i].n]=i;
}
node[tot].sum=((node[tot].sum+node[tot].maxsize-1)/node[tot].maxsize)*node[tot].maxsize;
printf("%lld %lld\n",node[tot].sum,node[tot].maxsize);
}
else if(cz==2){
string t;
cin>>t>>inc[inctot].n;
inc[inctot].t=strmp[t];
inc[inctot].ms=node[inc[inctot].t].maxsize;
inc[inctot].s=node[inc[inctot].t].sum;
inc[inctot].l=((incsum+inc[inctot].ms-1)/inc[inctot].ms)*inc[inctot].ms;
inc[inctot].r=inc[inctot].l+inc[inctot].s-1;
incsum=inc[inctot].r+1;
namemp[inc[inctot].n]=inctot;
printf("%lld\n",inc[inctot].l);
inctot++;
}
else if(cz==3){
string s,t="";
cin>>s;
int fd=0,mt;
int i=0;
for(;i<s.size();i++){
if(s[i]=='.') break;
else t+=s[i];
}
fd=inc[namemp[t]].l,mt=inc[namemp[t]].t;
i++,t="";
for(;i<s.size();i++){
if(s[i]=='.'){
fd+=node[mt].inc[node[mt].incmp[t]].l;
t="";
mt=node[mt].inc[node[mt].incmp[t]].t;
}
else t+=s[i];
}
fd+=node[mt].inc[node[mt].incmp[t]].l;
printf("%lld\n",fd);
}
else{
bool f=1;
string ans="";
int fd=0;
scanf("%lld",&fd);
int mt;
for(int i=0;i<inctot;i++){
if(inc[i].l>fd) break;
if(inc[i].l<=fd&&inc[i].r>=fd){
mt=inc[i].t;
ans+=inc[i].n;
fd-=inc[i].l;
f=0;
break;
}
}
if(f){
printf("ERR\n");
continue;
}
while(true){
if(mt>=0&&mt<=3){
f=0;
cout<<ans<<endl;
break;
}
f=1;
for(int i=0;i<node[mt].k;i++){
if(node[mt].inc[i].l>=fd) break;
if(node[mt].inc[i].l<=fd&&node[mt].inc[i].r>=fd){
ans+="."+node[mt].inc[i].n;
mt=node[mt].inc[i].t;
fd-=node[mt].inc[i].l;
f=0;
break;
}
}
if(f){
printf("ERR\n");
break;
}
}
}
}
return 0;
}