#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#include<vector>
using namespace std;
struct Paper {
string send, receive, lei;
int ip, nowt, datet;
};
struct IP {
int state, datet;//0,1,2,3分别表示未分配、待分配、占用、过期四种状态。
string zhan;
};
unordered_map<int, IP> iplist;
unordered_map<string, int> zhanlist;
int N, Tdef, Tmax, Tmin,n;
string host;
void init(void)
{
for (int i = 1; i <= N; i++)
{
IP tmp;
tmp.state = 0, tmp.datet = 0;
iplist.insert({ i,tmp });
}
}
Paper inputpaper(void)
{
Paper tmp;
cin >> tmp.nowt;
cin >> tmp.send >> tmp.receive >> tmp.lei >> tmp.ip >> tmp.datet;
return tmp;
}
void outputpaper(Paper& a)
{
cout << a.send << " " << a.receive << " " << a.lei << " " << a.ip << " "
<< a.datet << endl;
}
bool check_paper(Paper& a)
{
if (a.receive != "*" && a.receive != host)
if (a.lei != "REQ")
return false;
if (a.lei != "REQ" && a.lei != "DIS")
return false;
if ((a.receive == "*" && a.lei != "DIS") || (a.receive == host && a.lei == "DIS"))
return false;
return true;
}
int select_ip(string send,int nowt)
{
if (zhanlist.count(send) != 0 && iplist[zhanlist[send]].zhan == send)
return zhanlist[send];
int weifenpei = 0, guoqi = 0;
for (int i = 1; i <= N; i++)
{
if (iplist[i].state == 1 && iplist[i].datet <= nowt)
{
iplist[i].state = iplist[i].datet = 0;
zhanlist.erase(iplist[i].zhan);
}
if (iplist[i].state == 2 && iplist[i].datet <= nowt)
{
iplist[i].state = 3;
iplist[i].datet = 0;
}
if (iplist[i].state == 0)
{
weifenpei = i;
break;
}
if (iplist[i].state == 3 && guoqi == 0)
guoqi = i;
}
if (weifenpei)
return weifenpei;
if (guoqi)
return guoqi;
return 0;
}
void process_DIS(Paper a)
{
Paper res;
int ip = select_ip(a.send,a.nowt);
if (!ip)
return;
//这里有可能出错,就是map能不能直接等
iplist[ip].state = 1;
iplist[ip].zhan = a.send;
zhanlist[a.send] = ip;
//
if (a.datet == 0)
res.datet = a.nowt + Tdef;
else
{
if (a.datet - a.nowt > Tmax)
res.datet = a.nowt + Tmax;
else if (a.datet - a.nowt < Tmin)
res.datet = a.nowt + Tmin;
else
res.datet = a.datet;
}
//
iplist[ip].datet = res.datet;
res.send = host, res.receive = a.send, res.lei = "OFR", res.ip = ip;
outputpaper(res);
}
void process_REQ(Paper a)
{
Paper res;
//
if (a.receive != host)
{
if (zhanlist.count(a.send) != 0)
{
int ip = zhanlist[a.send];
iplist[ip].state = 0;
iplist[ip].datet = 0;
zhanlist.erase(a.send);
}
return;
}
//
if (a.ip >= 1 && a.ip <= N && iplist[a.ip].zhan == a.send)
;
else
{
res.send = host, res.receive = a.send, res.lei = "NAK", res.ip = a.ip;
res.datet = 0;
outputpaper(res);
return;
}
//
iplist[a.ip].state = 2;
//
if (a.datet == 0)
res.datet = a.nowt + Tdef;
else
{
if (a.datet - a.nowt > Tmax)
res.datet = a.nowt + Tmax;
else if (a.datet - a.nowt < Tmin)
res.datet = a.nowt + Tmin;
else
res.datet = a.datet;
}
//
iplist[a.ip].datet = res.datet;
res.send = host, res.receive = a.send, res.lei = "ACK", res.ip = a.ip;
outputpaper(res);
}
int main(void)
{
cin >> N >> Tdef >> Tmax >> Tmin >> host >> n;
while (n--)
{
Paper a;
a = inputpaper();
if (!check_paper(a))
continue;
if (a.lei == "DIS")
process_DIS(a);
else
process_REQ(a);
}
return 0;
}