#include<map>
#include<tuple>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define MAX_MEMBER 105
struct Varr{
std::string type_name;
int memory;
int start_address;
int end_address;
};
struct S{
int member_count;
int max_memory;
int memory_used;
std::map<std::string,Varr>member_guide;
};
std::map<std::string,S>guide;
std::map<std::string,int>get_memory;
std::map<std::string,Varr>guide_varr;
int nearNum(int x,int k){
int q=x/k,p=q*k;
return (p==x?x:p+k);
}
bool chk(const std::string &s){
return s=="byte"||s=="int"||s=="short"||s=="long";
}
int main(){
freopen("P9754_6.in","r",stdin);
freopen("P9754_6.ans","w",stdout);
guide["int"]={0,4,4,{}};
guide["byte"]={0,1,1,{}};
guide["long"]={0,8,8,{}};
guide["short"]={0,2,2,{}};
int cur_memory=0;
get_memory["byte"]=1;
get_memory["short"]=2;
get_memory["int"]=4;
get_memory["long"]=8;
int n;
std::cin>>n;
while(n--){
int op;
std::cin>>op;
if(op==1){
std::string struct_name;
std::cin>>struct_name;
int k;
std::cin>>k;
guide[struct_name].member_count=k;
int max_mem=0,now_memory=0;
for(int i=1;i<=k;i++){
std::string typename_;
std::cin>>typename_;
std::string member_name;
std::cin>>member_name;
max_mem=std::max(max_mem,get_memory[typename_]);
int start_add=nearNum(now_memory,get_memory[typename_]);
int end_add=start_add+get_memory[typename_]-1;
guide[struct_name].member_guide[member_name]={typename_,get_memory[typename_],start_add,end_add};
now_memory=end_add+1;
}
guide[struct_name].max_memory=max_mem;
get_memory[struct_name]=nearNum(now_memory,max_mem);
guide[struct_name].memory_used=get_memory[struct_name];
std::cout<<get_memory[struct_name]<<" "<<guide[struct_name].max_memory<<std::endl;
}else if(op==2){
std::string typename_;
std::cin>>typename_;
std::string varrible_name;
std::cin>>varrible_name;
guide_varr[varrible_name].type_name=typename_;
int varr_memory=get_memory[typename_];
guide_varr[varrible_name].memory=varr_memory;
int start_add=nearNum(cur_memory,guide[typename_].max_memory);
int end_add=start_add+get_memory[typename_]-1;
guide_varr[varrible_name].start_address=start_add;
guide_varr[varrible_name].end_address=end_add;
std::cout<<start_add<<std::endl;
cur_memory=end_add+1;
}else if(op==3){
std::string name;
std::cin>>name;
std::vector<std::string>visiting;
std::string t;
for(int i=0;i<name.size();i++){
if(name[i]=='.'){
visiting.push_back(t);
t.clear();
}else{
t=t+name[i];
}
}
if(t.size()!=0){
visiting.push_back(t);
t.clear();
}
if(visiting.size()==1){
std::cout<<guide_varr[visiting[0]].start_address<<std::endl;
}else{
int cur=0;
std::string fromstruct_name=guide_varr[visiting[0]].type_name;
for(int i=1;i<visiting.size();i++){
std::string nextstruct_name=guide[fromstruct_name].member_guide[visiting[i]].type_name;
cur=guide[fromstruct_name].member_guide[visiting[i]].start_address;
fromstruct_name=nextstruct_name;
}
std::cout<<guide_varr[visiting[0]].start_address+cur<<std::endl;
}
}else if(op==4){
int targetPosition;
std::cin>>targetPosition;
std::queue<std::pair<Varr,std::string>>q;
for(auto x:guide_varr){
q.push({x.second,x.first});
}
while(q.size()){
auto u=q.front();
q.pop();
if(u.first.start_address<=targetPosition&&u.first.end_address>=targetPosition&&chk(u.first.type_name)){
std::cout<<u.second<<std::endl;
goto Hello_World;
}
std::string varrtypename=u.first.type_name;
int starting=u.first.start_address;
int ending=u.first.end_address;
for(auto lx:guide[varrtypename].member_guide){
std::string path=u.second+"."+lx.first;
std::string typename__=lx.second.type_name;
int nowbegin=starting+lx.second.start_address;
int nowend=starting+lx.second.end_address;
std::pair<Varr,std::string>temp;
temp.first={typename__,get_memory[typename__],nowbegin,nowend};
temp.second=path;
q.push(temp);
}
}
puts("ERR");
}
Hello_World:;
}
}