You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.3 KiB
C++

#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long, long long> p_t;
typedef list<p_t> lst_t;
typedef map<long long, lst_t::iterator> mp_t;
long long hs(char *s)
{
long long r = 0;
for (char *p = s; *p; p++)
r = r * 10 + *p - '0';
return r;
}
int main()
{
char s[20];
lst_t LRU;
mp_t mp;
long long T, Q, M, op, v, blkid;
scanf("%lld", &T);
while (T--)
{
LRU.clear(), mp.clear();
scanf("%lld%lld", &Q, &M);
while (Q--)
{
scanf("%lld%s%lld", &op, s, &v), blkid = hs(s);
if (op == 0)
{
auto ite = mp.find(blkid);
if (ite == mp.end())
mp[blkid] = LRU.insert(LRU.end(), {blkid, v});
else
{
p_t p = {blkid, ite->second->second};
LRU.erase(ite->second);
mp[blkid] = LRU.insert(LRU.end(), p);
}
printf("%lld\n", mp[blkid]->second);
}
if (op == 1)
{
auto ite = mp.find(blkid);
if (ite == mp.end())
puts("Invalid");
else
{
auto ite2 = ite->second;
if (v == -1)
if (ite2 != LRU.begin())
printf("%lld\n", (--ite2)->second);
else
puts("Invalid");
if (v == 0)
if (ite2 != LRU.end())
printf("%lld\n", ite2->second);
else
puts("Invalid");
if (v == 1)
if (ite2 != LRU.end() && ++ite2 != LRU.end())
printf("%lld\n", ite2->second);
else
puts("Invalid");
}
}
while (LRU.size() > M)
{
mp.erase(LRU.begin()->first);
LRU.pop_front();
}
}
}
return 0;
}