#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
#define ll long long
using namespace std;
ll n;
struct node {
string s;
ll k;
ll siz, kind;
string t[110], n[110];
ll st[110], ed[110];
} a[110];
ll cnt;
ll Ti;
void query(string x, ll pos, ll shift, ll start) {
if(start >= x.length()) {
cout << shift << '\n';
}
string str;
for(ll i = start; i < x.length(); i++) {
if(x[i] == '.') {
start = i + 1;
break;
}
str += x[i];
}
for(ll i = 1; i <= a[pos].k; i++) {
if(a[pos].n[i] == str) {
if(a[pos].t[i] == "byte" || a[pos].t[i] == "int" || a[pos].t[i] == "long" || a[pos].t[i] == "short") {
cout << shift + a[pos].st[i] << '\n';
}
for(ll j = 1; j <= cnt; j++) {
if(a[j].s == a[pos].t[i]) {
query(x, j, shift + a[pos].st[i], start);
break;
}
}
}
}
}
void query2(ll q, ll pos, string path) {
for(ll i = 1; i <= a[pos].k; i++) {
if(a[pos].st[i] <= q && q <= a[pos].ed[i]) {
if(a[pos].t[i] == "byte" || a[pos].t[i] == "int" || a[pos].t[i] == "long" || a[pos].t[i] == "short") {
cout << path + '.' + a[pos].n[i] << '\n';
}
for(ll j = 1; j <= cnt; j ++) {
if(a[j].s == a[pos].t[i]) {
if(pos != 0) query2(q-a[pos].st[i], j, path + '.' + a[pos].n[i]);
else query2(q-a[pos].st[i], j, a[pos].n[i]);
}
}
return;
}
}
printf("ERR\n");
}
int main() {
a[0].kind = 0;
a[0].siz = 0;
scanf("%lld", &n);
while(n--) {
ll op;
scanf("%lld", &op);
switch(op) {
case 1: {
cnt++;
cin >> a[cnt].s >> a[cnt].k;
a[cnt].kind = 0;
ll ti = 0;
for(ll i = 1; i <= a[cnt].k; i++) {
cin >> a[cnt].t[i] >> a[cnt].n[i];
if(a[cnt].t[i] == "byte") {
a[cnt].kind = max(a[cnt].kind, 1ll);
a[cnt].st[i] = ti;
a[cnt].ed[i] = ti;
ti++;
} else if(a[cnt].t[i] == "short") {
a[cnt].kind = max(a[cnt].kind, 2ll);
if(ti % 2) ti += (2 - ti % 2);
a[cnt].st[i] = ti;
a[cnt].ed[i] = a[cnt].st[i]+1;
ti+=2;
} else if(a[cnt].t[i] == "int") {
a[cnt].kind = max(a[cnt].kind, 4ll);
if(ti % 4) ti += (4 - ti % 4);
a[cnt].st[i] = ti;
a[cnt].ed[i] = a[cnt].st[i]+3;
ti+=4;
} else if(a[cnt].t[i] == "long") {
a[cnt].kind = max(a[cnt].kind, 8ll);
if(ti % 8) ti += (8 - ti % 8);
a[cnt].st[i] = ti;
a[cnt].ed[i] = a[cnt].st[i]+7;
ti+=8;
} else {
for(ll j = 1; j < cnt; j++) {
if(a[j].s == a[cnt].t[i]) {
a[cnt].kind = max(a[cnt].kind, a[j].kind);
if(ti % a[j].kind) ti += (a[j].kind - ti % a[j].kind);
a[cnt].st[i] = ti;
a[cnt].ed[i] = a[cnt].st[i]+a[j].siz-1;
ti+=a[j].siz;
}
}
}
}
if(ti % a[cnt].kind) ti += (a[cnt].kind - ti % a[cnt].kind);
a[cnt].siz = ti;
cout << a[cnt].siz << ' ' << a[cnt].kind << '\n';
break;
}
case 2: {
a[0].k++;
cin >> a[0].t[a[0].k] >> a[0].n[a[0].k];
if(a[0].t[a[0].k] == "byte") {
a[0].kind = max(a[0].kind, 1ll);
cout << Ti << '\n';
a[0].st[a[0].k] = Ti;
a[0].ed[a[0].k] = Ti;
Ti++;
} else if(a[0].t[a[0].k] == "short") {
a[0].kind = max(a[0].kind, 2ll);
if(Ti % 2) Ti += (2 - Ti % 2);
cout << Ti << '\n';
a[0].st[a[0].k] = Ti;
a[0].ed[a[0].k] = a[0].st[a[0].k]+1;
Ti+=2;
} else if(a[0].t[a[0].k] == "int") {
a[0].kind = max(a[0].kind, 4ll);
if(Ti % 4) Ti += (4 - Ti % 4);
cout << Ti << '\n';
a[0].st[a[0].k] = Ti;
a[0].ed[a[0].k] = a[0].st[a[0].k]+3;
Ti+=4;
} else if(a[0].t[a[0].k] == "long") {
a[0].kind = max(a[0].kind, 8ll);
if(Ti % 8) Ti += (8 - Ti % 8);
cout << Ti << '\n';
a[0].st[a[0].k] = Ti;
a[0].ed[a[0].k] = a[0].st[a[0].k]+7;
Ti+=8;
} else {
for(ll j = 1; j <= cnt; j++) {
if(a[j].s == a[0].t[a[0].k]) {
a[0].kind = max(a[0].kind, a[j].kind);
if(Ti % a[j].kind) Ti += (a[j].kind - Ti % a[j].kind);
cout << Ti << '\n';
a[0].st[a[0].k] = Ti;
a[0].ed[a[0].k] = a[0].st[a[0].k]+a[j].siz-1;
Ti+=a[j].siz;
}
}
}
break;
}
case 3: {
string str;
cin >> str;
str += '.';
query(str, 0, 0, 0);
break;
}
case 4: {
ll addr;
cin >> addr;
query2(addr, 0, "");
break;
}
}
}
}