大样例过不了。两个小样例都能过。
#include<bits/stdc++.h>
#define debug cout<<"debug"<<endl
#define int long long
using namespace std;
const int N=1e6+10;
map<string,int>id,trans,sta;
map<pair<int,int>,string>fuck;
// 结构体的编号,其实题目给定的何尝不是四个结构体
// 元素编号依次离散化一下
// 每个元素在它所出现的结构体内的起始位置
int cnt,mem,yuanshen;
// 结构体的编号,当前内存起始位置
string damn[N];
struct element { int beg,typ,siz,align; };
// 在结构体内的起始位置 / 类型 / 大小 / 对齐要求
struct structure {
int typ,beg,siz,align;
vector<element>e;
} store[N];
// 结构体类型
int defcnt; structure def[N];
// 实际定义的元素个数 / 实际定义的元素
void init() {
id["byte"]=1,id["short"]=2,id["int"]=3,id["long"]=cnt=4;
for(int i=1;i<5;++i) store[i].siz=store[i].align=1<<(i-1);
for(int i=1;i<5;++i) store[i].typ=i;
}
void solve1() {
string s; int k; cin>>s>>k;
// 类型 / 元素数量
id[s]=++cnt,store[cnt].typ=cnt; int now=0;
for(int i=1;i<=k;++i) {
string t,n; cin>>t>>n; int cur=id[t];
trans[n]=i-1,fuck[{cnt,i-1}]=n;
element ins; ins={now,cur,store[cur].siz,store[cur].align};
store[cnt].align=max(store[cnt].align,store[cur].align);
if(now%ins.align) now=(now/ins.align+1)*ins.align,ins.beg=now;
sta[n]=now,now+=ins.siz,store[cnt].e.push_back(ins);
}
if(now%store[cnt].align) now=(now/store[cnt].align+1)*store[cnt].align;
store[cnt].siz=now; cout<<now<<' '<<store[cnt].align<<"\n";
}
void solve2() {
string t,n; cin>>t>>n;
// 类型 / 名称
int cur=id[t]; def[++defcnt]=store[cur];
def[defcnt].typ=cur,trans[n]=defcnt,damn[defcnt]=n;
if(mem%store[cur].align) mem=(mem/store[cur].align+1)*store[cur].align;
def[defcnt].beg=mem,cout<<mem<<"\n";
mem+=def[defcnt].siz;
}
void solve3() {
string s,tmp=""; cin>>s;
// 访问的元素
vector<string>vec;
for(int i=0;i<s.size();++i) {
if(s[i]=='.') vec.push_back(tmp),tmp="";
else tmp+=s[i];
}
vec.push_back(tmp);
int cur=trans[vec[0]],res=def[cur].beg;
for(int i=1;i<vec.size();++i) res+=sta[vec[i]];
cout<<res<<"\n";
}
void solve4() {
int addr,cur=0; cin>>addr;
for(int i=1;i<=defcnt;++i) if(addr>=def[i].beg) cur=i;
if(!cur) return cout<<"ERR\n",void();
addr-=def[cur].beg; int now=def[cur].typ;
vector<string>res; res.push_back(damn[cur]);
// for(int i=1;i<=defcnt;++i) cout<<def[i].beg<<' '<<def[i].beg+def[i].siz-1<<endl;
while(1) {
// cout<<"NOW: "<<now<<endl;
// cout<<"ADDR: "<<addr<<endl;
if(now<5) {
if(addr>=store[now].siz) return cout<<"ERR\n",void();
cout<<res[0];
for(int i=1;i<res.size();++i) cout<<'.'<<res[i];
return cout<<"\n",void();
}
// debug;
cur=-1;
for(int i=0;i<store[now].e.size();++i)
if(addr>=store[now].e[i].beg) cur=i;
// cout<<"CUR: "<<cur<<endl;
if(cur<0) return cout<<"ERR\n",void();
res.push_back(fuck[{now,cur}]);
addr-=store[now].e[cur].beg;
now=store[now].e[cur].typ;
}
}
void solve() {
int op; cin>>op;
if(op==1) return solve1();
if(op==2) return solve2();
if(op==3) return solve3();
return solve4();
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0),init();
cin>>yuanshen;
while(yuanshen--) solve();
return 0;
}