#include<bits/stdc++.h>
using namespace std;
struct node{
string in,name;
};
struct Node{
vector<node> vt;
int dq,siz;
};
map<string,Node>mp;
map<string,string>fnode;
string dz[100005];
int nowdz=-1;
int main(){
// freopen("struct.in","r",stdin);
// freopen("struct.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
int op;
cin>>op;
if(op==1){
string a;
int k;
cin>>a>>k;
int cnt=0;
for(int i=1;i<=k;i++){
string s,name;
cin>>s>>name;
mp[a].vt.push_back((node){
s,name
});
if(s=="byte")cnt=max(cnt,1);
else if(s=="short")cnt=max(cnt,2);
else if(s=="long")cnt=max(cnt,8);
else if(s=="int")cnt=max(cnt,4);
else cout<<"RNF"<<a[-114514];
}
mp[a].dq=cnt;
mp[a].siz=k*cnt;
cout<<cnt*k<<" "<<cnt<<endl;
}
else if(op==2){
string t,n;
cin>>t>>n;
fnode[n]=t;
cout<<nowdz+1<<endl;
if(t=="byte"||t=="short"||t=="int"||t=="long"){
int rnf=0;
if(t=="byte")rnf=1;
else if(t=="short")rnf=2;
else if(t=="int")rnf=4;
else if(t=="long")rnf=8;
for(int j=1;j<=rnf;j++){
dz[++nowdz]=t;
}
}
int sz=mp[t].vt.size();
for(int i=0;i<sz;i++){
int rnf=0;
if(mp[t].vt[i].in=="byte")rnf=1;
else if(mp[t].vt[i].in=="short")rnf=2;
else if(mp[t].vt[i].in=="int")rnf=4;
else if(mp[t].vt[i].in=="long")rnf=8;
else cout<<"RNF"<<mp[t].vt[i].in[-114514];
for(int j=1;j<=rnf;j++){
string use=n;
use+=".";
use+=mp[t].vt[i].name;
dz[++nowdz]=use;
}
for(int i=rnf+1;i<=mp[t].dq;i++){
dz[++nowdz]="ERR";
}
}
}
else if(op==3){
string s;
cin>>s;
for(int i=0;i<=nowdz;i++){
if(dz[i]==s){
cout<<i<<endl;
break;
}
}
}
else{
long long x;
cin>>x;
if(x>nowdz){
cout<<"ERR\n";
}
else{
cout<<dz[x]<<endl;
}
}
}
return 0;
}