/**F:冷血格斗场
查看
提交
统计
提问
总时间限制:
1000ms
内存限制:
65536kB
描述
为了迎接08年的奥运会,让大家更加了解各种格斗运动,facer新开了一家冷血格斗场。格斗场实行会员制,但是新来的
会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。
我们假设格斗的实力可以用一个正整数表示,成为实力值,两人的实力值可以相同。另外,每个人都有一个唯一的id,也是
一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值
越小越好,如果有多个人的实力值与他差别相同,则他会选择id最小的那个。
不幸的是,Facer一不小心把比赛记录弄丢了,但是他还保留着会员的注册记录。现在请你帮facer恢复比赛纪录,按照时间
顺序依次输出每场比赛双方的id。
输入
第一行一个数n(0 < n <=100000),表示格斗场新来的会员数(不包括facer)。以后n行每一行两个数,按照入会的时间给
出会员的id和实力值。一开始,facer就算是会员,id为1,实力值1000000000。
输出
N行,每行两个数,为每场比赛双方的id,新手的id写在前面。
样例输入
3
2 3
3 1
4 2
样例输出
2 1
3 2
4 2
*/
#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
class player
{
public:
int pow;
int id;
player(int a, int b):pow(a),id(b){};
};
class MyLess
{
public:
bool operator() (const player& pla1,const player& pla2)
{
return pla1.pow < pla2.pow || (pla1.pow == pla2.pow && pla1.id < pla2.id);
}
};
int main()
{
set<player,MyLess> mp;
int n = 0;
scanf("%d", &n);
mp.insert(player(1000000000,1));
for(int i = 0; i < n; ++i)
{
int d = 0, po = 0;
scanf("%d%d" ,&d, &po);
mp.insert(player(po, d));
set<player,MyLess>::iterator p = mp.find(player(po, d));
set<player,MyLess>::iterator p1 = p;
--p1;
set<player,MyLess>::iterator p2 = p;
++p2;
if(po == mp.begin() -> pow && d == mp.begin() -> id)
{
printf("%d %d\n", d, p2->id);
if(p->pow == p2->pow) mp.erase(p2);
}
else if(po == mp.rbegin() -> pow && d == mp.rbegin() -> id)
{
printf("%d %d\n", d, p1->id);
if(p->pow == p1->pow) mp.erase(p1);
}
else
{if(p2->pow - po < po - p1->pow)
printf("%d %d\n", d, p2->id);
else if(po - p1->pow < p2->pow - po)
printf("%d %d\n", d, p1->id);
else
{
if(p1->id < p2-> id)
printf("%d %d\n", d, p1->id);
else
printf("%d %d\n", d, p2->id);
}
if (p->pow == p2->pow)
mp.erase(p2);
else if (p->pow == p1->pow)
mp.erase(p);
}
}
return 0;
}