#include<bits/stdc++.h>
#define fst first
#define sec second
#define mkp(a,b) make_pair(a,b)
#define usetime() (double)clock () / CLOCKS_PER_SEC * 1000.0
using namespace std;
typedef long long LL;
typedef pair<LL,int> pii;
const int maxn=155;
void read(int& x){
char c;
bool f=0;
while((c=getchar())<48) f|=(c==45);
x=c-48;
while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
x=(f ? -x : x);
}
void read(LL& x){
char c;
bool f=0;
while((c=getchar())<48) f|=(c==45);
x=c-48;
while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;
x=(f ? -x : x);
}
struct edge{
string name;
int to;
};
pii d[maxn];
vector<edge> mp[maxn];
unordered_map<string,int> m;
unordered_map<string,pii> var;
set<pii> va;
int n;
int tot=0;
LL len=0;
LL mceil(LL x,LL y){
if(x%y==0) return x/y;
else return x/y+1;
}
int main(){
freopen("P9754_7.in","r",stdin);
freopen("wwa.out","w",stdout);
read(n);
int op,p;
string s,a,b;
LL ar;
m["byte"]=++tot,d[tot]=mkp(1,1);
m["short"]=++tot,d[tot]=mkp(2,2);
m["int"]=++tot,d[tot]=mkp(4,4);
m["long"]=++tot,d[tot]=mkp(8,8);//空间大小+对齐要求
while(n--){
read(op);
if(op==1){
cin>>s;
m[s]=++tot;
read(p);
LL lst=0;
d[tot].sec=0;
while(p--){
cin>>a>>b;
mp[tot].push_back((edge){b,m[a]});
d[tot].sec=max(d[tot].sec,d[m[a]].sec);
lst=mceil(lst,d[m[a]].sec)*d[m[a]].sec+d[m[a]].fst;
}
d[tot].fst=lst;
//cout<<"ans=";
printf("%lld %d\n",d[tot].fst,d[tot].sec);
}
if(op==2){
cin>>a>>b;
var[b]=mkp(mceil(len,d[m[a]].sec)*d[m[a]].sec,m[a]);
va.insert(var[b]);
len=var[b].fst+d[m[a]].fst;
//cout<<"ans=";
printf("%lld\n",var[b].fst);
}
if(op==3){
cin>>s;
//cout<<"ans=";
s.append(1,'.');
int k=0;
a.clear();
while(s[k]!='.') a.append(1,s[k++]);
int now=var[a].sec;
LL ans=var[a].fst;
a.clear();
for(int i=k+1;i<(int)s.size();i++){
if(s[i]=='.'){
for(int j=0;j<(int)mp[now].size();j++){
int v=mp[now][j].to;
if(mp[now][j].name==a){
ans=mceil(ans,d[v].sec)*d[v].sec;
now=v;
break;
}
else{
ans=mceil(ans,d[v].sec)*d[v].sec+d[v].fst;
}
}
a.clear();
}
else{
a.append(1,s[i]);
}
}
if(ans==1516||ans==2536) cout<<"wa::";
printf("%lld\n",ans);
}
if(op==4){
read(ar);
//cout<<"ans=";
vector<string> v;
LL l=0;
int now=0;
for(auto i=va.begin();i!=va.end();i++){
if(i->fst<=ar) l=i->fst,now=i->sec;
else break;
}
for(auto i=var.begin();i!=var.end();i++){
if(i->sec.fst==l){
v.push_back(i->fst);
break;
}
}
if(!now){
cout<<"ERR\n";
continue;
}
while(now>4){
int tp=-1;
for(int j=0;j<(int)mp[now].size();j++){
int v=mp[now][j].to;
LL li=mceil(l,d[v].sec)*d[v].sec+d[v].fst;
if(li>ar){
l=mceil(l,d[v].sec)*d[v].sec,tp=j;
break;
}
else{
l=li;
}
}
if(tp<0){
l=-1e18;
break;
}
v.push_back(mp[now][tp].name);
now=mp[now][tp].to;
}
//cout<<now<<' '<<ar-l+1<<endl;
l=mceil(l,d[now].sec)*d[now].sec;
if(l>ar||ar-l>=d[now].fst){
cout<<"ERR";
}
else{
cout<<v[0];
for(int i=1;i<(int)v.size();i++){
cout<<'.'<<v[i];
}
}
putchar('\n');
}
}
return 0;
}
//^o^
下载了 #7 的数据,发现是3,4操作有问题