//题意,给你n个区间,要求你把这n个区间分成两个阵营,不同阵营之间的区间不能有重叠的部分,比如[1,3],[2,4],就重叠了。
//方法:一定能满足第二个阵营最左边区间的左端点>第一个阵营最右边区间的右端点。所以现在你就把第一个阵营最右边区间的右端点找出来。
//先用sort对所有区间的左端点从小到大排个序,直到你找到某个区间的左端点比上一个区间的右端点大,这个点就是两个阵营的分界点。
//注意,用另一个数组把左端点和右端点记录下来,然后在这个新数组里排序寻找分界点,这样原数组只用比较它的右端点和分界值的大小就可以了
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100005
using namespace std;
int t;
int n;
int x;
int l[maxn];
int r[maxn];
typedef struct seg
{
int l;
int r;
}node;
node s[maxn];
int max(int a,int b)
{
return a>b?a:b;
}
bool cmp(node a,node b)
{
return a.l<b.l;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>l[i]>>r[i];
s[i].l=l[i];
s[i].r=r[i];
}
sort(s+1,s+n+1,cmp);
x=s[1].r;
int flag=0;
for(int i=1;i<=n;i++)
{
if(s[i].l>x)
{
flag=1;
break;
}
else
x=max(x,s[i].r);
}
if(!flag)
cout<<"-1"<<"
";
else
{
for(int i=1;i<=n;i++)
if(r[i]<=x)
cout<<"1"<<" ";
else
cout<<"2"<<" ";
}
}
return 0;
}