Description
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。
我们可以把马路看成一个数轴,马路的一端在数轴1的位置,另一端在L的位置;
数轴上的每个整数点,即1,2,...L的位置,都种有一棵树。
由于马路上的N个区域[L1,R1],[L2,R2]...[LN,RN]要用来建地铁,区域之间可能有重合的部分。
现在要把这些区域的树(包括区域端点处的两棵树)移走。
你的任务是计算每次移走这些树后,马路上还有多少棵树。
Input
两个整数N和L。
2~N+1行,两个整数Li,Ri。
Output
N行,每行一个整数,表示移走后树的数量。
Sample Input
2 42 33 4
Sample Output
21
HINT
对于50%的数据, N,L,Li,Ri <= 103。
对于100%的数据, N,L,Li,Ri <= 105。
#include<stdio.h>
int
n,x,y,l,ans,k,top,a[100001],s[100001];
int
find(
int
k)
{
top=0;
if
(a[k]==k)
return
k;
while
(a[k]!=k)
{
s[top++]=k;
k=a[k];
}
for
(
int
i=0;i<top;i++)
a[s[i]]=k;
return
k;
}
void
merge(
int
x,
int
y)
{
a[find(x)]=find(y);
}
int
main()
{
scanf
(
"%d%d"
,&n,&l);
ans=l;
for
(
int
i=1;i<=l+1;i++)
a[i]=i;
while
(n--)
{
scanf
(
"%d%d"
,&x,&y);
k=find(x);
while
(k<=y)
{
merge(k,k+1);
k=find(k);
ans--;
}
printf
(
"%d\n"
,ans);
}
}