luogu 民间数据 wa 最后一个点。
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
struct structt{
int k;
int s[101],a[101],o[101];
string tp[101],nm[101];
int maxn,siz;
string id;
}f[101];
struct node{
int s,a,b;
string tp,nm;
}g[101];
map<string,int> mp1,mp2;
map<string,int> mp;
signed main(){
freopen("struct3.in","r",stdin);
freopen("struct.out","w",stdout);
mp1["byte"]=1,mp1["short"]=2,mp1["int"]=4,mp1["long"]=8;
mp2["byte"]=1,mp2["short"]=2,mp2["int"]=4,mp2["long"]=8;
int q=read();
int cnt=0,tot=0;
while(q--){
int op=read();
if(op==1){
cnt++;
cin>>f[cnt].id;
f[cnt].k=read();
for(int i=1;i<=f[cnt].k;i++){
cin>>f[cnt].tp[i]>>f[cnt].nm[i];
int lst=f[cnt].o[i-1]+f[cnt].s[i-1];
f[cnt].a[i]=mp2[f[cnt].tp[i]];
f[cnt].s[i]=mp1[f[cnt].tp[i]];
if(lst%f[cnt].a[i]) lst+=(f[cnt].a[i]-lst%f[cnt].a[i]);
f[cnt].o[i]=lst;
f[cnt].maxn=max(f[cnt].maxn,f[cnt].a[i]);
}
int lst=f[cnt].o[f[cnt].k]+f[cnt].s[f[cnt].k];
if(lst%f[cnt].maxn) lst+=(f[cnt].maxn-lst%f[cnt].maxn);
f[cnt].siz=lst;
mp1[f[cnt].id]=f[cnt].siz;
mp2[f[cnt].id]=f[cnt].maxn;
mp[f[cnt].id]=cnt;
cout<<f[cnt].siz<<" "<<f[cnt].maxn<<endl;
}else if(op==2){
tot++;
cin>>g[tot].tp>>g[tot].nm;
g[tot].a=mp2[g[tot].tp];
g[tot].s=mp1[g[tot].tp];
int lst=g[tot-1].b+g[tot-1].s;
if(lst%g[tot].a) lst+=(g[tot].a-lst%g[tot].a);
g[tot].b=lst;
cout<<g[tot].b<<endl;
}else if(op==3){
string s;
cin>>s;
s+=".";
string now="";
int len=s.size(),tp;
for(int i=0;i<len;i++){
if(s[i]=='.'){
tp=i+1;
break;
}
now+=s[i];
}
int ans=0,nwid;
for(int i=1;i<=tot;i++){
if(g[i].nm==now){
ans=g[i].b;
nwid=mp[g[i].tp];
break;
}
}
if(nwid==0){
write(ans);
puts("");
continue;
}
now="";
for(int i=tp;i<len;i++){
if(s[i]=='.'){
for(int j=1;j<=f[nwid].k;j++){
if(f[nwid].nm[j]==now){
// cout<<f[nwid].nm[j]<<endl;
ans+=f[nwid].o[j];
nwid=mp[f[nwid].tp[j]];
break;
}
}
// cout<<nwid<<endl;
if(nwid==0){
break;
}
now="";
continue;
}
now+=s[i];
}
write(ans);
puts("");
}else{
int now=read();
string ans="",ty;
int nwid=-1;
for(int i=1;i<=tot;i++){
if(g[i].b+g[i].s>now&&g[i].b<=now){
nwid=mp[g[i].tp];
now-=g[i].b;
ans+=g[i].nm;
ty=g[i].tp;
break;
}
}
if(nwid==-1){
puts("ERR");
continue;
}
if(!nwid){
if(mp1[ty]>now)cout<<ans<<endl;
else puts("ERR");
continue;
}
ans+=".";
while(now){
if(now<0){
puts("ERR");
break;
}
// cout<<ans<<" "<<now<<endl;
int fl=0;
for(int i=1;i<=f[nwid].k;i++){
// cout<<f[nwid].o[i]<<" "<<f[nwid].s[i]<<endl;
if(f[nwid].o[i]+f[nwid].s[i]>now&&f[nwid].o[i]<=now){
// cout<<"--\n";
now-=f[nwid].o[i];
ans+=f[nwid].nm[i];
ty=f[nwid].tp[i];
nwid=mp[f[nwid].tp[i]];
fl=1;
break;
}
}
if(!fl){
puts("ERR");
break;
}
if(!nwid){
// cout<<ty<<" "<<now<<endl;
if(mp1[ty]>now) cout<<ans<<endl;
else puts("ERR");
break;
}
ans+=".";
}
}
}
return 0;
}