#include <iostream>
#include <queue>
#include <map>
using namespace std;
long long addr_start=0;
long long num[10005][2];
int maxn=0;
string finds[10005];
map<string,pair<long long,long long> > m;
map<string,int>limit;
map<string,string> structt[10005],structt2[10005];
map<string,int> findd;
map<string,int> find_small;
map<string,int> where1,where2;
queue<string> q,q2;
bool check(string sss){
if(sss=="byte"||sss=="short"||sss=="int"||sss=="long"){
return false;
}
return true;
}
void solve_before1(string tt,string nn,string ss,int &ans1,int &ans2){
int lenn=findd[tt];
int large=0;
int require=0;
int last=0;
for(int i=1;i<=lenn;i++){
require=max(require,where2[structt[i][tt]]);
}
for(int i=1;i<=lenn;i++){
if(check(structt[i][tt])){
int lar=last+large;
last=where1[structt[i][tt]];
require=max(require,where2[structt[i][tt]]);
int len=require;
int large2=lar/len*len;
if(large2!=lar){
lar=large2+len;
}
large=lar;
}else{
int len=last+large;
last=limit[structt[i][tt]];
require=max(require,limit[structt[i][tt]]);
int lim=require;
int len2=len/lim*lim;
if(len2!=len){
len=len2+lim;
}
large=len;
}
}
ans1=large;
ans2=require;
limit[ss]=max(limit[ss],require);
}
void solve1(string tt,string nn,string ss,int numm,int &ans1,int &ans2){
int large=0;
int lim=0;
if(check(tt)){
int ans1,ans2;
solve_before1(tt,nn,ss,ans1,ans2);
large=ans1;
lim=ans2;
}else{
large=limit[tt];
lim=limit[tt];
limit[ss]=max(limit[ss],limit[tt]);
}
structt[numm][ss]=tt;
structt2[numm][ss]=nn;
findd[ss]++;
ans1=large;
ans2=lim;
int ans11=ans1/ans2*ans2;
if(ans11!=ans1){
ans1=ans11+ans2;
}
where1[ss]+=ans1;
where2[ss]+=ans2;
}
void solve_before2(string tt,string nn){
if(!check(tt)){
maxn++;
int lim=limit[tt];
long long len=lim+addr_start-1;
finds[maxn]=nn;
num[maxn][0]=addr_start;
long long len2=len/lim*lim;
if(len2!=len){
len=len2+lim;
}
m[nn]=make_pair(addr_start,len);
addr_start=len;
num[maxn][1]=addr_start-1;
return;
}else{
q.push(nn);
long long addr2=addr_start+limit[tt]-1;
int limmit=0;
int last2=0;
for(int i=1;i<=findd[tt];i++){
maxn++;
limmit=max(limmit,where2[structt[i][tt]]);
long long name=last2+addr_start-1;
last2=where1[structt[i][tt]];
if(check(structt[i][tt])){
maxn--;
solve_before2(structt[i][tt],structt2[i][tt]);
while(!q.empty()){
q2.push(q.front());
q.pop();
}
while(!q2.empty()){
if(q2.size()>1){
q.push(q2.front());
}
q2.pop();
}
}else{
finds[maxn]="";
q.push(structt2[i][tt]);
while(!q.empty()){
q2.push(q.front());
finds[maxn]+=q.front();
if(q.size()!=1){
finds[maxn]+=".";
}
q.pop();
}
while(!q2.empty()&&q2.size()>1){
q.push(q2.front());
q2.pop();
}
find_small[finds[maxn]]=addr_start;
num[maxn][0]=addr_start;
name+=where1[structt[i][tt]];
num[maxn][1]=name;
if(i!=findd[tt]){
long long name2=name/where2[structt[i+1][tt]]*where2[structt[i+1][tt]];
if(name2!=name){
name=name2+where2[structt[i][tt]];
}
}
m[nn]=make_pair(addr_start,name);
addr_start=name;
}
}
return;
}
}
void solve2(string tt,string nn){
long long addr2=addr_start/limit[tt]*limit[tt];
if(addr2!=addr_start){
addr_start=addr2+limit[tt];
}
if(!check(tt)){
maxn++;
int lim=limit[tt];
long long len=limit[tt]+addr_start-1;
finds[maxn]=nn;
num[maxn][0]=addr_start;
find_small[nn]=addr_start;
long long len2=len/lim*lim;
if(len2!=len){
len=len2+lim;
}
m[nn]=make_pair(addr_start,len);
cout<<addr_start<<endl;
addr_start=len;
num[maxn][1]=addr_start-1;
}else{
cout<<addr_start<<endl;
long long addr2;
int limmit=0;
int last=0;
for(int i=1;i<=findd[tt];i++){
maxn++;
limmit=max(limmit,where2[structt[i][tt]]);
long long name=last+addr_start-1;
last=where1[structt[i][tt]];
if(check(structt[i][tt])){
maxn--;
q.push(nn);
solve_before2(structt[i][tt],structt2[i][tt]);
q.pop();
}else{
finds[maxn]=nn+"."+structt2[i][tt];
find_small[finds[maxn]]=addr_start;
num[maxn][0]=addr_start;
name+=where1[structt[i][tt]];
num[maxn][1]=name;
if(i!=findd[tt]){
long long name2=name/where2[structt[i+1][tt]]*where2[structt[i+1][tt]];
if(name2!=name){
name=name2+where2[structt[i][tt]];
}
}
m[nn]=make_pair(addr_start,name);
addr_start=name;
}
}
}
}
void solve3(string str){
cout<<find_small[str]<<endl;
}
void solve4(long long ad){
int l=1,r=maxn;
int flag=0;
while(l<=r){
int mid=l+r>>1;
if(num[mid][0]<=ad&&ad<=num[mid][1]){
cout<<finds[mid]<<endl;
flag=1;
break;
}else if(ad>num[mid][1]){
l=mid+1;
}else{
r=mid-1;
}
}
if(flag==0&&!(num[l+r>>1][0]<=ad&&ad<=num[l+r>>1][1])){
cout<<"ERR\n";
}
}
signed main(){
int n;
cin>>n;
where1["byte"]=where2["byte"]=limit["byte"]=1;
where1["short"]=where2["short"]=limit["short"]=2;
where1["int"]=where2["int"]=limit["int"]=4;
where1["long"]=where2["long"]=limit["long"]=8;
for(int ii=1;ii<=n;ii++){
int op;
cin>>op;
if(op==1){
string s;
int k;
cin>>s>>k;
int ans1=0,ans2=0,last=0;
for(int i=1;i<=k;i++){
string t,n;
cin>>t>>n;
int try1,try2;
ans1+=last;
solve1(t,n,s,i,try1,try2);
last=try1-1;
ans2=max(ans2,try2);
int ans11=ans1/try2*try2;
if(ans11!=ans1){
ans1=ans11+try2;
}
}
ans1+=last;
int ans11=ans1/ans2*ans2;
if(ans11!=ans1){
ans1=ans11+ans2;
}
cout<<ans1<<" "<<ans2<<endl;
}else if(op==2){
string t,n;
cin>>t>>n;
solve2(t,n);
}else if(op==3){
string s;
cin>>s;
solve3(s);
}else{
long long addr;
cin>>addr;
solve4(addr);
}
}
return 0;
}