代码可读性略差,见谅。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
struct po{//point
string typ;
string nam;
int bh;
ll start,len,end;//addr
};
struct nd{
vector<po>v;
int bh;
ll siz,len;
}a[205];
struct stru{
int ndtp;
int bh;
ll start,end;//addr
string nam;
}f[205];
map<string,nd>mp;//typ
map<string,int>fd;//place
int n,sl,tot;
int op,k;
string s;
string s2,tp;
int addr;
string ans;
po mkpo(string typ,string nam,ll &start){
po c;
c.typ=typ;
c.nam=nam;
c.bh=mp[typ].bh;
c.start=ceil(start*1.0/mp[typ].len)*mp[typ].len;
c.len=mp[typ].len;
c.end=c.start+c.len-1;
start=c.end+1;
return c;
}
nd mknd(string typ,int len,int bh){//basic typ
nd c;
c.bh=bh;
c.len=len;
c.siz=len;
return c;
}
string finds(int adr,int poi){
// cout<<a[poi].bh<<" ";
if(adr>a[poi].siz)return "_";
if(poi<=4)return "";
int p2,pl;
for(int i=0;i<a[poi].v.size();i++){
p2=a[poi].v[i].bh;
pl=a[poi].v[i].end;
if(pl<=adr)continue;
else {
return '.'+a[poi].v[i].nam+finds(adr-a[poi].v[i].start,p2);
}
}
return "";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
sl=4;
a[1]=mp["byte"]=mknd("byte",1,1);
a[2]=mp["short"]=mknd("short",2,2);
a[3]=mp["int"]=mknd("int",4,3);
a[4]=mp["long"]=mknd("long",8,4);
cin>>n;
while(n--){
cin>>op;
if(op==1){
cin>>s>>k;
sl++;
a[sl].bh=sl;
for(int i=1;i<=k;i++){
cin>>tp>>s2;
a[sl].v.push_back(mkpo(tp,s2,a[sl].siz));
a[sl].len=max(a[sl].len,mp[tp].len);
}
a[sl].siz=ceil(a[sl].siz*1.0/a[sl].len)*a[sl].len;
mp[s]=a[sl];
cout<<a[sl].siz<<" "<<a[sl].len<<"\n";
}else if(op==2){
cin>>tp>>s;
f[++tot].ndtp=mp[tp].bh;
f[tot].nam=s;
fd[s]=tot;
if(tot==1){
f[tot].start=0;
f[tot].end=a[f[tot].ndtp].siz-1;
}else{
f[tot].start=ceil((f[tot-1].end+1)*1.0/a[f[tot].ndtp].len)*a[f[tot].ndtp].len;
f[tot].end=f[tot].start+a[f[tot].ndtp].siz-1;
}
cout<<f[tot].start<<"\n";
}else if(op==3){
cin>>s2;
s2=s2+'.';
int l=s2.size();
s2='-'+s2;
ll place=0;
int poi;
bool st=1;
s="";
for(int i=1;i<=l;i++){
if(s2[i]=='.'){
if(st){
st=0;
place=f[fd[s]].start;
poi=f[fd[s]].ndtp;
}else{
for(int j=0;j<a[poi].v.size();j++){
if(a[poi].v[j].nam==s){
place+=a[poi].v[j].start;
poi=a[poi].v[j].bh;
break;
}
}
}
s="";
}else{
s=s+s2[i];
}
}
cout<<place<<"\n";
}else{
int poi=-1,p,st;
cin>>addr;
for(int i=1;i<=tot;i++){
p=f[i].start;
if(addr>=p)poi=i;
else break;
}
if(poi==-1){
cout<<"ERR\n";
continue;
}
ans="";
ans=ans+f[poi].nam;
poi=f[poi].ndtp;
ans=ans+finds(addr-p,poi);
int l=ans.size();
if(ans[l-1]=='_'){
cout<<"ERR\n";
}else{
cout<<ans<<'\n';
}
}
}
return 0;
}
/*
5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10
*/