先按s从小到大排序
若相同再按E从大到小
在点相同时要特殊处理
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int tree[200009];
int all[200009];
int temp[200009];
struct data
{
int l,r;
int no;
}node[200009];
int lowbit(int x)
{
return x&(-x);
}
void updata(int x,int c)
{
int i;
for(i=x;i<=n;i+=lowbit(i))
{
tree[i]+=c;
}
}
int getsum(int x)
{
int i;
int temp=0;
for(i=x;i>=1;i-=lowbit(i))
{
temp+=tree[i];
}
return temp;
}
int cmp(data a,data b)
{
if(a.l==b.l)
return a.r>b.r;
else
return a.l<b.l;
}
int main()
{
n=100000;
int t;
while(scanf("%d",&t),t)
{
int i;
for(i=1;i<=100000;i++)
{
tree[i]=0;
all[i]=0;
}
for(i=1;i<=t;i++)
{
scanf("%d%d",&node[i].l,&node[i].r);
node[i].no=i;
}
sort(&node[1],&node[t+1],cmp);
for(i=1;i<=t;i++)
{
if(node[i].l!=node[i-1].l||node[i].r!=node[i-1].r)//如果改点与前面的不同
all[i]=getsum(n)-getsum(node[i].r-1);
else//若相同的话
all[i]=all[i-1];
updata(node[i].r,1);
}
for(i=1;i<=t;i++)
{
temp[node[i].no]=all[i];
}
printf("%d",temp[1]);
for(i=2;i<=t;i++)
{
printf(" %d",temp[i]);
}
printf("\n");
}
}