调了一上午+一中午我人直接炸了。
好像是操作四有问题,判ERR判多了。
//#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2,bmi,bmi2,fma")
#include<bits/stdc++.h>
using namespace std;
long long max(long long a,long long b){
return a>b?a:b;
}
long long min(long long a,long long b){
return a<b?a:b;
}
#ifndef __unix__
#define getchar_unlocked _getchar_nolock
#endif
inline long long read(){
long long x=0,f=1;
char c=getchar_unlocked();
while(c<'0'||c>'9'){
if(c=='-'){
f=-1;
}
c=getchar_unlocked();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar_unlocked();
}
return x*f;
}
void write(long long x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
return;
}
long long n,i,j,op,k,addr,addres,num;
map<string,tuple<string,string,long long> > q[101];
map<string,long long> len,sum,requ,fir,sum1;
map<string,string> typ;
string ss[101];
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
requ["byte"]=1;
requ["short"]=2;
requ["int"]=4;
requ["long"]=8;
sum["byte"]=1;
sum["short"]=2;
sum["int"]=4;
sum["long"]=8;
sum1["byte"]=1;
sum1["short"]=2;
sum1["int"]=4;
sum1["long"]=8;
n=read();
addres=-1;
for(i=1;i<=n;i++){
op=read();
if(op==1){
string s;
cin>>s;
requ[s]=0;
len[s]=0;
long long l=-1;
k=read();
while(k--){
string s1,s2;
cin>>s1>>s2;
if((l+1)%requ[s1]==0){
q[++len[s]][s]={s1,s2,l+1};
l+=sum[s1];
}
else{
q[++len[s]][s]={s1,s2,l+1-(l+1)%requ[s1]+requ[s1]};
l=l+1-(l+1)%requ[s1]+requ[s1]+sum[s1]-1;
}
requ[s]=max(requ[s],requ[s1]);
}
sum1[s]=l;
sum[s]=ceil((l+1)*1.0/requ[s])*requ[s];
write(sum[s]);
putchar(' ');
write(requ[s]);
puts("");
}
else if(op==2){
string s1,s2;
cin>>s1>>s2;
ss[++num]=s2;
typ[s2]=s1;
if((addres+1)%requ[s1]==0){
fir[s2]=addres+1;
write(addres+1);
puts("");
addres+=sum[s1];
}
else{
fir[s2]=addres+1-(addres+1)%requ[s1]+requ[s1];
write(addres+1-(addres+1)%requ[s1]+requ[s1]);
puts("");
addres=addres+1-(addres+1)%requ[s1]+requ[s1]+sum[s1]-1;
}
}
else if(op==3){
string s,tmp,pre;
cin>>s;
long long l=s.size();
queue<string> p;
for(j=0;j<l;j++){
if(s[j]!='.'){
tmp+=s[j];
}
else{
p.push(tmp);
tmp="";
}
}
p.push(tmp);
long long ans;
ans=fir[p.front()];
pre=typ[p.front()];
while(!p.empty()){
tmp=p.front();
p.pop();
if(pre=="byte"||pre=="short"||pre=="int"||pre=="long"||p.empty()){
break;
}
for(j=1;j<=len[pre];j++){
if(get<1>(q[j][pre])==p.front()){
ans+=get<2>(q[j][pre]);
pre=get<0>(q[j][pre]);
break;
}
}
}
write(ans);
puts("");
}
else{
addr=read();
string tmp,pre;
for(j=1;j<=num;j++){
if(fir[ss[j]]<=addr&&fir[ss[j]]+sum1[typ[ss[j]]]>addr){
tmp=ss[j];
break;
}
}
if(j>num){
puts("ERR");
}
else{
long long ans=fir[tmp];
bool pd=0;
queue<string> p;
pre=typ[tmp];
while(1){
p.push(tmp);
if(pre=="byte"||pre=="short"||pre=="int"||pre=="long"){
pd=1;
break;
}
long long l=len[pre];
for(j=1;j<=len[pre];j++){
if(ans+get<2>(q[j][pre])<=addr&&ans+get<2>(q[j][pre])+sum1[get<0>(q[j][pre])]>addr){
ans+=get<2>(q[j][pre]);
tmp=get<1>(q[j][pre]);
pre=get<0>(q[j][pre]);
break;
}
}
if(j>l){
break;
}
}
if(pd){
cout<<p.front();
p.pop();
while(!p.empty()){
cout<<'.'<<p.front();
p.pop();
}
puts("");
}
else{
puts("ERR");
}
}
}
}
return 0;
}