#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int k, len, maxn;
string nn;
vector<string> name, type;
vector<int> mem, p;
map<string, int> mem_find;
}a[10000];
struct var{
int st;
string type, name;
};
int cnt, now;
vector<var> vv;
map<string, int> mapp, mem, mem_v, maxn, fin;
string in;
inline int calc(int _a, int _b)
{
return (_a%_b==0?_a/_b:_a/_b+1)*_b;
}
inline string read(int &x)
{
string res="";
while(x<in.size() && in[x]!='.') res+=in[x], ++x;
x++;
return res;
}
signed main()
{
mem["byte"]=1, mem["short"]=2, mem["int"]=4, mem["long"]=8;
maxn["byte"]=1, maxn["short"]=2, maxn["int"]=4, maxn["long"]=8;
int T;
cin>>T;
while(T--){
int opt;
cin>>opt;
if(opt==1){
string name;
int k;
cin>>name>>k, ++cnt;
a[cnt].mem.resize(k), a[cnt].name.resize(k), a[cnt].p.resize(k);
a[cnt].type.resize(k), a[cnt].nn=name, a[cnt].k=k;
int tmp=0;
for(int i=0; i<k; i++){
string type, name;
cin>>type>>name;
a[cnt].type[i]=type, a[cnt].name[i]=name;
a[cnt].mem[i]=mem[type],
a[cnt].maxn=max(a[cnt].maxn, maxn[type]);
tmp=calc(tmp, maxn[type]);
a[cnt].p[i]=tmp, tmp+=a[cnt].mem[i];
a[cnt].mem_find[name]=i;
}
a[cnt].len=calc(tmp, a[cnt].maxn),
mem[a[cnt].nn]=a[cnt].len, maxn[a[cnt].nn]=a[cnt].maxn;
fin[a[cnt].nn]=cnt;
cout<<a[cnt].len<<' '<<a[cnt].maxn<<endl;
}
if(opt==2){
string type, name;
cin>>type>>name;
now=calc(now, maxn[type]);
vv.push_back((var){now, type, name});
cout<<now<<endl;
now+=mem[type];
}
if(opt==3){
cin>>in;
int x=0;
string tmp1=read(x);
int id=0;
for(id=0; id<vv.size() && vv[id].name!=tmp1; id++);
int ans=vv[id].st;
int tmp5=0;
for(tmp5=1; tmp5<=cnt && a[tmp5].nn!=vv[id].type; tmp5++);
id=tmp5;
while(x<in.size()){
tmp1=read(x);
int tmp2=a[id].mem_find[tmp1];
ans+=a[id].p[tmp2];
int tmp4;
for(tmp4=1; tmp4<=cnt && a[tmp4].nn!=a[id].type[tmp2]; tmp4++);
if(tmp4==cnt+1) break;
id=tmp4;
}
cout<<ans<<endl;
}
if(opt==4){
int id;
int m, l;
cin>>m, l=0;
if(m>=now){
cout<<"ERR\n";
continue;
}
for(id=0; id<vv.size() && vv[id].st<=m; id++);
id--, l=vv[id].st;
if(vv[id].st+mem[vv[id].type]-1<m){
cout<<"ERR\n";
continue;
}
stringstream ans;
ans<<vv[id].name;
id=fin[vv[id].type];
while(1){
int i;
for(i=0; i<a[id].k && a[id].p[i]+l<=m; i++);
i--, l+=a[id].p[i];
ans<<"."<<a[id].name[i];
int tmp2=mem[a[id].type[i]];
if(tmp2+l<=m) {
cout<<"ERR\n";
break;
}
if(a[id].type[i]=="int" || a[id].type[i]=="byte" ||
a[id].type[i]=="short" || a[id].type[i]=="long"){
cout<<ans.str()<<endl;
break;
}
id=fin[a[id].type[i]];
}
}
}
return 0;
}