#include <stdio.h>
#include <stdlib.h>
#define SIZE 128
typedef struct Node {
int key;
int val[2];
struct Node* next;
} Node;
typedef struct {
Node* table[SIZE];
} haxiset;
haxiset* create() {
haxiset* ht = (haxiset*)malloc(sizeof(haxiset));
// if (ht == NULL) {
// fprintf(stderr, "Memory allocation failed\0");
// exit(EXIT_FAILURE);
// }
for (int i = 0; i < SIZE; i++) {
ht->table[i] = NULL;
}
return ht;
}
unsigned int haxifunc(int k) {
return (unsigned int)(k % SIZE + SIZE) % SIZE; // 确保k为非负数
}
void insert(haxiset* ht, int k, int val, int cns) {
int haxi = haxifunc(k);
Node* newnode = (Node*)malloc(sizeof(Node));
// if (newnode == NULL) {
// fprintf(stderr, "Memory allocation failed\n");
// exit(EXIT_FAILURE);
// }
newnode->key = k;
newnode->val[0] = val;
newnode->val[1] = cns;
newnode->next = ht->table[haxi];
ht->table[haxi] = newnode;
}
int search(haxiset* ht, int k, int setalltime, int setallval) {
int haxi = haxifunc(k);
Node* node = ht->table[haxi];
while (node != NULL) {
if (node->key == k) {
if (setalltime > node->val[1]) return setallval;
return node->val[0];
}
node = node->next;
}
return -1;
}
void destory(haxiset* ht) {
for (int i = 0; i < SIZE; i++) {
Node* node = ht->table[i];
while (node != NULL) {
Node* pre = node;
node = node->next;
free(pre);
}
}
free(ht);
}
int main() {
int n = 0;
scanf("%d", &n);
haxiset* ht = create();
int setalltime = -1;
int setallval;
for (int choose = 0, cns = 0, k, v, ans; cns < n; cns++) {
scanf("%d", &choose);
switch (choose) {
case 1:
scanf("%d %d", &k, &v);
insert(ht, k, v, cns);
break;
case 2:
scanf("%d", &k);
ans = search(ht, k, setalltime, setallval);
printf("%d\n", ans);
break;
case 3:
scanf("%d", &setallval);
setalltime = cns;
break;
}
}
destory(ht);
return 0;
}