#include <bits/stdc++.h>
using namespace std;
struct Node {
int key, value, freq, time;
Node(int k, int v, int f, int t): key(k), value(v), freq(f), time(t) {}
};
vector<int> implementLFU(int cacheSize, vector<string> queries) {
vector<int> result;
if (cacheSize == 0) return result;
unordered_map<int, Node*> cache;
int time = 0;
for (auto &q : queries) {
stringstream ss(q);
string type;
ss >> type;
if (type == "PUT") {
int key, value;
ss >> key >> value;
time++;
if (cache.find(key) != cache.end()) {
cache[key]->value = value;
cache[key]->freq++;
cache[key]->time = time;
} else {
if ((int)cache.size() >= cacheSize) {
int minFreq = INT_MAX, oldestTime = INT_MAX, evictKey = -1;
for (auto &p : cache) {
Node* node = p.second;
if (node->freq < minFreq ||
(node->freq == minFreq && node->time < oldestTime)) {
minFreq = node->freq;
oldestTime = node->time;
evictKey = node->key;
}
}
delete cache[evictKey];
cache.erase(evictKey);
}
cache[key] = new Node(key, value, 1, time);
}
}
else if (type == "GET") {
int key;
ss >> key;
time++;
if (cache.find(key) != cache.end()) {
cache[key]->freq++;
cache[key]->time = time;
result.push_back(cache[key]->value);
} else {
result.push_back(-1);
}
}
}
return result;
}
int main() {
int cacheSize, q;
cin >> cacheSize >> q;
cin.ignore();
vector<string> queries(q);
for (int i = 0; i < q; i++) {
getline(cin, queries[i]);
}
vector<int> ans = implementLFU(cacheSize, queries);
for (int x : ans) cout << x << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQga2V5LCB2YWx1ZSwgZnJlcSwgdGltZTsKICAgIE5vZGUoaW50IGssIGludCB2LCBpbnQgZiwgaW50IHQpOiBrZXkoayksIHZhbHVlKHYpLCBmcmVxKGYpLCB0aW1lKHQpIHt9Cn07Cgp2ZWN0b3I8aW50PiBpbXBsZW1lbnRMRlUoaW50IGNhY2hlU2l6ZSwgdmVjdG9yPHN0cmluZz4gcXVlcmllcykgewogICAgdmVjdG9yPGludD4gcmVzdWx0OwogICAgaWYgKGNhY2hlU2l6ZSA9PSAwKSByZXR1cm4gcmVzdWx0OwoKICAgIHVub3JkZXJlZF9tYXA8aW50LCBOb2RlKj4gY2FjaGU7IAogICAgaW50IHRpbWUgPSAwOyAKCiAgICBmb3IgKGF1dG8gJnEgOiBxdWVyaWVzKSB7CiAgICAgICAgc3RyaW5nc3RyZWFtIHNzKHEpOwogICAgICAgIHN0cmluZyB0eXBlOwogICAgICAgIHNzID4+IHR5cGU7CgogICAgICAgIGlmICh0eXBlID09ICJQVVQiKSB7CiAgICAgICAgICAgIGludCBrZXksIHZhbHVlOwogICAgICAgICAgICBzcyA+PiBrZXkgPj4gdmFsdWU7CiAgICAgICAgICAgIHRpbWUrKzsKCiAgICAgICAgICAgIGlmIChjYWNoZS5maW5kKGtleSkgIT0gY2FjaGUuZW5kKCkpIHsKICAgICAgICAgICAgICAgIGNhY2hlW2tleV0tPnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICBjYWNoZVtrZXldLT5mcmVxKys7CiAgICAgICAgICAgICAgICBjYWNoZVtrZXldLT50aW1lID0gdGltZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgoaW50KWNhY2hlLnNpemUoKSA+PSBjYWNoZVNpemUpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgbWluRnJlcSA9IElOVF9NQVgsIG9sZGVzdFRpbWUgPSBJTlRfTUFYLCBldmljdEtleSA9IC0xOwogICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byAmcCA6IGNhY2hlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUqIG5vZGUgPSBwLnNlY29uZDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUtPmZyZXEgPCBtaW5GcmVxIHx8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAobm9kZS0+ZnJlcSA9PSBtaW5GcmVxICYmIG5vZGUtPnRpbWUgPCBvbGRlc3RUaW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRnJlcSA9IG5vZGUtPmZyZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRlc3RUaW1lID0gbm9kZS0+dGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2aWN0S2V5ID0gbm9kZS0+a2V5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtldmljdEtleV07CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuZXJhc2UoZXZpY3RLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IG5ldyBOb2RlKGtleSwgdmFsdWUsIDEsIHRpbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSAKICAgICAgICBlbHNlIGlmICh0eXBlID09ICJHRVQiKSB7CiAgICAgICAgICAgIGludCBrZXk7CiAgICAgICAgICAgIHNzID4+IGtleTsKICAgICAgICAgICAgdGltZSsrOwogICAgICAgICAgICBpZiAoY2FjaGUuZmluZChrZXkpICE9IGNhY2hlLmVuZCgpKSB7CiAgICAgICAgICAgICAgICBjYWNoZVtrZXldLT5mcmVxKys7CiAgICAgICAgICAgICAgICBjYWNoZVtrZXldLT50aW1lID0gdGltZTsKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2FjaGVba2V5XS0+dmFsdWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygtMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKICAgIGludCBjYWNoZVNpemUsIHE7CiAgICBjaW4gPj4gY2FjaGVTaXplID4+IHE7CiAgICBjaW4uaWdub3JlKCk7CgogICAgdmVjdG9yPHN0cmluZz4gcXVlcmllcyhxKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgaSsrKSB7CiAgICAgICAgZ2V0bGluZShjaW4sIHF1ZXJpZXNbaV0pOwogICAgfQoKICAgIHZlY3RvcjxpbnQ+IGFucyA9IGltcGxlbWVudExGVShjYWNoZVNpemUsIHF1ZXJpZXMpOwogICAgZm9yIChpbnQgeCA6IGFucykgY291dCA8PCB4IDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==