 /**//*
题意: 模拟题

一个人要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;
}
|