rt,只对了D性质
#include <bits/stdc++.h>
#define int long long
using namespace std;
int read(){
int s=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)){
s=s*10+(ch-'0');
ch=getchar();
}
return s*f;
}
struct node{
string typ,s;
int l,r;
};
map<string,vector<node> >mp;
map<string,int>siz,dq;
int n;
string s,t,p,rt;
vector<node>tmp;
map<string,bool>check;
signed main(){
dq["byte"]=1,siz["byte"]=1;
dq["short"]=2,siz["short"]=2;
dq["int"]=4,siz["int"]=4;
dq["long"]=8,siz["long"]=8;
check["byte"]=1;
check["short"]=1;
check["int"]=1;
check["long"]=1;
n=read();
while(n--){
int op=read();
if(op==1){
cin>>s;
int k=read();
tmp.resize(k);tmp.shrink_to_fit();
for(node &v:tmp){
cin>>v.typ>>v.s;
dq[s]=max(dq[s],dq[v.typ]);
}
tmp[0].l=0,tmp[0].r=siz[tmp[0].typ]-1;
for(int i=1;i<k;i++)
tmp[i].l=(tmp[i-1].r/dq[s]+1)*dq[s],
tmp[i].r=tmp[i].l+siz[tmp[i].typ]-1;
siz[s]=(tmp.back().r/dq[s]+1)*dq[s];
mp[s]=tmp;
printf("%lld %lld\n",siz[s],dq[s]);
}
if(op==2){
cin>>t>>p;
mp[""].push_back({t,p,0,0});
dq[""]=max(dq[""],dq[t]);
tmp=mp[s=""];
tmp[0].l=0,tmp[0].r=siz[tmp[0].typ]-1;
for(int i=1;i<(int)tmp.size();i++)
tmp[i].l=(tmp[i-1].r/dq[s]+1)*dq[s],
tmp[i].r=tmp[i].l+siz[tmp[i].typ]-1;
siz[s]=(tmp.back().r/dq[s]+1)*dq[s];
mp[s]=tmp;
printf("%lld\n",tmp.back().l);
}
if(op==3){
cin>>s;
int res=0;
s.push_back('.');
t="";
rt="";
for(int i=0;i<(int)s.size();i++){
if(s[i]=='.'){
tmp=mp[rt];
for(int j=0;j<(int)tmp.size();j++)
if(tmp[j].s==t){
res+=tmp[j].l;
rt=tmp[j].typ;
break;
}
t="";
}
else t.push_back(s[i]);
}
printf("%lld\n",res);
}
if(op==4){
int res=read();
string rt="";
s="";
for(;!check.count(rt);){
tmp=mp[rt];
for(int j=0;j<=(int)tmp.size();j++)
if(j==(int)tmp.size()||tmp[j].l>res){
// printf("%lld %lld %lld\n",j,e[rt][j-1].r,e[rt][j].l);
if(j==0||res>tmp[j-1].r) {
puts("ERR");
goto ex;
}
s+=tmp[j-1].s;
s.push_back('.');
res-=tmp[j-1].l,rt=tmp[j-1].typ;
break;
}
}
s.pop_back();
printf("%s\n",s.c_str());
ex:;
}
}
return 0;
}