 /**//*
題意: 模擬題

一個人要submit(包含多個數據已修改的,目的是要更新服務器對應的版本)
1)該數據之前更新的時間 < 該人獲得數據的時間(SYNC 或 SUBMIT) 則更新服務器該數據的更新時間
2)否則,如果該人的優先級大于之前修改的,則更新服務器該數據的更新時間
否則不變

按時間排個序搞就行了
最后要輸出被更新過的數據的最后修改者,數據沒被修改過的話不用輸出
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>

using namespace std;

const int MAXN = 10010;

map<int,int> mp;

struct OP
  {
int id,pr,kind,line;
int yy,mm,dd,h,m,s;
char str[10];
long long time;
void read(int _id,int _pr)
 {
id = _id;
pr = _pr;
scanf(" [%d/%d/%d %d:%d:%d] %s",&yy,&mm,&dd,&h,&m,&s,str);
if(str[0]=='M')
 {
kind = 2;
scanf("%d",&line);
mp[line] = -1;
}
else
 {
if(str[1]=='Y')kind = 1;
else kind = 3;
}
time = s + m*60 + h*3600 + dd*3600*24 + mm*3600*24*31 + yy*(long long)3600*24*31*366;
}
void print()
 {
printf("%d [%04d/%02d/%02d %02d:%02d:%02d] %d\n",id,yy,mm,dd,h,m,s,kind);
}
bool operator<(const OP &B)const
 {
return time<B.time;
}
};

char name[MAXN][40];
vector<int>MV[MAXN];
OP op[MAXN*5];
long long get[MAXN];

int main()
  {
//freopen("in","r",stdin);
int n;
while(scanf("%d",&n),n)
 {
int pr,m;
int tot = 0;
mp.clear();
for(int i=1;i<=n;i++)
 {
scanf("%s%d%d",&name[i],&pr,&m);
MV[i].clear();
for(int j=0;j<m;j++)
op[tot++].read(i,pr);
}
sort(op,op+tot);
for(int i=0;i<tot;i++)
 {
//op[i].print();
int id = op[i].id;
if(op[i].kind==1)get[id] = op[i].time;
else if(op[i].kind==2)MV[id].push_back(op[i].line);
else
 {
for(int j=0;j<MV[id].size();j++)
 {
int line = MV[id][j];
long long last = mp[line]==-1?-1:op[mp[line]].time;
if(last<get[id])mp[line] = i;
else if(op[mp[line]].pr<op[i].pr)mp[line] = i;
}
MV[id].clear();
get[id] = op[i].time;
}
}
for(map<int,int>::iterator it = mp.begin();it!=mp.end();it++)
 {
if(it->second==-1)continue;//
int id = it->second;
printf("%d [%04d/%02d/%02d %02d:%02d:%02d] BY %s\n",it->first,op[id].yy,op[id].mm,op[id].dd,op[id].h,op[id].m,op[id].s,name[op[id].id]);
}
puts("END");
}
return 0;
}
|