1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include<cstdio> #include<queue> using namespace std; const int maxn=5010; struct node{ int l,r,id; node(int l=0,int r=0,int id=0):l(l),r(r),id(id){} bool operator < (const node& x) const { return l==x.l?r>x.r:l>x.l; } }; priority_queue<node> x,y; int pos[2][maxn]; int main(){ int n; while(~scanf("%d",&n)&&n){ while(!x.empty()) x.pop(); while(!y.empty()) y.pop(); for(int i=1;i<=n;++i){ int l1,l2,r1,r2; scanf("%d%d%d%d",&l1,&l2,&r1,&r2); x.push(node(l1,r1,i)),y.push(node(l2,r2,i)); } bool flag=true; for(int i=1;i<=n;++i){ node t; while((t=x.top()).l<i) x.pop(),t.l=i,x.push(t); if(x.top().l>i){flag=false;break;} if(x.top().l==i&&x.top().r>=i) pos[0][x.top().id]=i,x.pop(); else {flag=false;break;} while((t=y.top()).l<i) y.pop(),t.l=i,y.push(t); if(y.top().l==i&&y.top().r>=i) pos[1][y.top().id]=i,y.pop(); else {flag=false;break;} } if(flag) for(int i=1;i<=n;++i) printf("%d %d\n",pos[0][i],pos[1][i]); else printf("IMPOSSIBLE\n"); } return 0; }
|