#include<bits/stdc++.h>
using namespace std;
#define int long long
map<pair<string,long long>,long long>addr;//存储数组名称(pair.first),数组下标(pair.second),该位置的值的大小
map<string,long long>siz;//存储数组的大小,防溢出
string a,b;
struct anss{string name;int sizee;};//用于方便存储(在findname()使用过)
bool conti=true;//判断是否出现不合法情况
anss findname(string s){//找到一个数组如a[10]的数组名(a)
int len=s.size(),i=0;
long long x=0;
string ans;
for(i=0;i<len;i++){
if(s[i]=='['){
i++;
break;
}
ans+=s[i];
}
for(i;i<len;i++){
if(s[i]==']'){
break;
}
x=x*10+s[i]-48;
}
return (anss){ans,x};
}
struct for_find2{string name;int wei;};
for_find2 find2(string s,int it){//给定a[0](s)与左中括号的下标(it),要找到a
string ans; int k;
for(k=it;k>=0;k--){
if(s[k]=='['||k==0){
int Max=k+1;
if(k==0) Max--;
for(int i=Max;i<=it;i++){
ans+=s[i];
}
break;
}
}
return (for_find2){ans,k-1};
}
anss search(string s){//用于找到真正的地址,处理a[b[c[0]]]的情况
int len=s.size(),i=0;
for(i;i<len;i++){
if(s[i]>='0'&&s[i]<='9'){
break;
}
}
int x=0;
for(int j=i;j<len;j++){
if(s[j]==']'){
i-=2;break;
}
x=x*10+s[j]-48;
}
//cout<<i<<endl;
for_find2 ty=find2(s,i);i=ty.wei;
//cout<<ty.name<<" "<<ty.wei<<endl;
if(siz[ty.name]<=x){
cout<<-1<<endl;exit(0);
}
if(i<0){
return (anss){ty.name,x};
}
int si=addr[make_pair(ty.name,x)];
while(i>=0){
for_find2 tt=find2(s,i);
i=tt.wei;
//cout<<tt.name<<" "<<siz[tt.name]<<" "<<si<<endl;
if(siz[tt.name]<=si){
cout<<-1<<endl;exit(0);
}
if(i<0){
return (anss){tt.name,si};
}
si=addr[make_pair(tt.name,si)];
}
cout<<-1<<endl;exit(0);
}
signed main(){
while(1){
cin>>a>>b;
if(a=="int"){
anss type=findname(b);
siz[type.name]=type.sizee;
}
else if(a=="cout"){
anss type=search(b);
cout<<addr[make_pair(type.name,type.sizee)]<<endl;
}
else{//给数组赋值的情况
anss type=search(a);int x=0;
for(int i=0;i<b.size();i++){
x=x*10+b[i]-48;
}
addr[make_pair(type.name,type.sizee)]=x;
}
}
}
求助大佬,为什么会TLE啊啊啊啊啊(大悲