diqiuyi @ 2023-10-22 12:50:47
rt,全 RE,赛时一直没调出来
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return f*x;
}
struct stt{
ll siz,len;//元素个数,对齐
string nam[105],lx[105];//名,类型
map<string,int> mp;//成员对应编号
ll cd;
}x;
struct mem{
string lx;//类型
ll l,r;//所占区间
};
map<string,stt> m;
map<string,mem> me;
map<string,int> nxt;
int n,opt,d;
string s,ss,sss;
ll mx=-1;
vector<pair<string,string> > g;
bool flag;
void ak(string a,ll val){
// puts("fc");
if(val<0){
flag=1;
return ;
}
ll now=0;
stt b=m[me[a].lx];
if(val>=b.cd){
flag=1;
return ;
}
nxt[a]=-1;
for(int i=1;i<=b.siz;i++){
ll now2=now+m[b.lx[i]].cd;
now2=(now2+m[b.lx[i]].len-1)/m[b.lx[i]].len*m[b.lx[i]].len;
if(now2>val){
me[b.nam[i]].lx=b.lx[i];
ak(b.nam[i],val-now);
if(!flag) nxt[a]=i;
break;
}
else now=now2;
}
if(nxt[a]==-1&&b.siz) flag=1;
}
int main(){
freopen("struct.in","r",stdin);
freopen("struct.out","w",stdout);
n=read();
m["byte"].len=m["byte"].cd=1,m["short"].len=m["short"].cd=2,m["int"].len=m["int"].cd=4,m["long"].len=m["long"].cd=8;
while(n--){
opt=read();
if(opt==1){
cin>>s,x.siz=read(),x.len=0,x.cd=0,x.mp.clear();
for(int i=1;i<=x.siz;i++){
cin>>x.lx[i]>>x.nam[i],x.mp[x.nam[i]]=i;x.len=max(x.len,m[x.lx[i]].len);
}
// puts("A");
for(int i=1;i<=x.siz;i++)
x.cd=((m[x.lx[i]].cd+x.cd+m[x.lx[i]].len-1)/m[x.lx[i]].len)*m[x.lx[i]].len;
// puts("b");
x.cd=(x.cd+x.len-1)/x.len*x.len;
m[s]=x;
printf("%lld %d\n",x.cd,x.len);
}
else if(opt==2)
cin>>s>>ss,me[ss].lx=s,me[ss].l=mx+1,me[ss].r=mx+m[s].cd,g.push_back(make_pair(s,ss)),
mx=(me[ss].r+m[s].len-1)/m[s].len*m[s].len-1,printf("%lld\n",me[ss].l);
else if(opt==3){
cin>>s,ss="";
ll ans=0;
for(int i=0;i<s.size();i++)
if(s[i]^'.') ss+=s[i];
else{
ans=me[ss].l;
break;
}
// cout<<ss<<'\n';
sss="";
for(int i=ss.size()+1;i<s.size();i++)
if(s[i]^'.') sss+=s[i];
else{
x=m[me[ss].lx];
int pos=x.mp[sss];
// cout<<pos<<'\n';
ll now=0;
for(int j=1;j<pos;j++)
now=((now+m[x.lx[j]].cd+m[x.lx[j]].len-1)/m[x.lx[j]].len)*m[x.lx[j]].len;
now=(now+m[x.lx[pos]].len-1)/m[x.lx[pos]].len*m[x.lx[pos]].len;
ans+=now;
me[sss].lx=x.lx[pos];
ss=sss,sss="";
}
x=m[me[ss].lx];
int pos=x.mp[sss];
// cout<<ss<<' '<<sss<<' '<<pos<<'\n';
ll now=0;
for(int j=1;j<pos;j++)
now=((now+m[x.lx[j]].cd+m[x.lx[j]].len-1)/m[x.lx[j]].len)*m[x.lx[j]].len;
now=(now+m[x.lx[pos]].len-1)/m[x.lx[pos]].len*m[x.lx[pos]].len;
ans+=now;
printf("%lld\n",ans);
}
else{
d=read(),flag=0;
// bool flg=0;
for(int i=0;i<g.size();i++)
if(me[g[i].second].r>=d){
ak(g[i].second,d-me[g[i].second].l);
if(!flag){
s=g[i].second;
cout<<s,s=m[me[s].lx].nam[nxt[s]];
while(1){
cout<<'.'<<s;
if(~nxt[s]) s=m[me[s].lx].nam[nxt[s]];
else break;
}
putchar(10);
}
else puts("ERR");
break;
}
if(g.size()&&me[g[g.size()-1].second].r<d) puts("ERR");
// printf("%d\n",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
*/