RT
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int n, op, k, siz, nowaddr;
string typ, nam, strnam;
// type, size
unordered_map<string, int> sz, pagesz;
// type, an array of members (type, name)
unordered_map<string, vector<pair<string, string> > > structs;
// start addr of elements
unordered_map<string, int> staddr;
// elements (name, type)
vector<pair<string, string> > elements;
bool is_basic_type(string typ) {
return typ == "byte" || typ == "short" || typ == "int" || typ == "long";
}
int getaddr(string typnam, int addr) {
int typsz = pagesz[typnam];
if (addr % typsz) {
if (addr < typsz) {
addr = typsz;
} else {
addr += typsz - (addr % typsz);
}
}
return addr;
}
int getaddr(int typsz, int addr) {
if (addr % typsz) {
if (addr < typsz) {
addr = typsz;
} else {
addr += typsz - (addr % typsz);
}
}
return addr;
}
void new_element(string typ, string nam) {
nowaddr = getaddr(typ, nowaddr);
// cout << typ << " " << nam << " " << nowaddr << endl;
staddr[nam] = nowaddr;
if (is_basic_type(typ)) {
nowaddr += sz[typ];
elements.push_back({typ, nam});
} else {
for (auto i : structs[typ]) {
new_element(i.first, nam + '.' + i.second);
}
}
nowaddr = staddr[nam] + sz[typ];
}
signed main() {
// freopen("struct.in", "rt", stdin);
// freopen("struct.out", "wt", stdout);
sz["byte"] = pagesz["byte"] = 1;
sz["short"] = pagesz["short"] = 2;
sz["int"] = pagesz["int"] = 4;
sz["long"] = pagesz["long"] = 8;
cin >> n;
while (n--) {
cin >> op;
switch (op) {
case (1): {
cin >> strnam >> k;
vector<pair<string, string> > v;
for (int i = 1; i <= k; i++) {
cin >> typ >> nam;
sz[strnam] = getaddr(typ, sz[strnam]) + sz[typ];
pagesz[strnam] = max(pagesz[strnam], pagesz[typ]);
v.push_back({typ, nam});
}
structs[strnam] = v;
sz[strnam] = getaddr(pagesz[strnam], sz[strnam]);
cout << sz[strnam] << " " << pagesz[strnam] << endl;
break;
}
case (2): {
cin >> typ >> nam;
cout << getaddr(typ, nowaddr) << endl;
new_element(typ, nam);
break;
}
case (3): {
cin >> nam;
cout << staddr[nam] << endl;
break;
}
case (4): {
cin >> k;
bool p = true;
for (auto i : elements) {
if (staddr[i.second] <= k && staddr[i.second] + sz[i.first] > k) {
cout << i.second << endl;
p = false;
break;
}
}
if (p) {
cout << "ERR\n";
}
break;
}
}
}
}