原题链接
区间合并
#include<cstdio>
#include<cstring>
using namespace std;
int pre[200010];
int next[200010];
int num[200010];
void int_i(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
num[i]=1;
next[i]=i+1;
}
}
int fa(int x)
{
if(x!=pre[x]) return pre[x]=fa(pre[x]);
return pre[x];
}
void merge(int x,int y)
{
int tx=fa(x);
int ty=fa(y);
if(tx==ty) return ;
if(num[tx]>=num[ty])
{
num[tx]+=num[ty];
pre[ty]=tx;
}
else
{
num[ty]+=num[tx];
pre[tx]=ty;
}
return ;
}
int main()
{
int n,p,temp;
scanf("%d%d",&n,&p);
int_i(n);
int order,x,y;
for(int i=1;i<=p;i++)
{
scanf("%d%d%d",&order,&x,&y);
if(order==1)
{
merge(x,y);
}
else if(order==2)
{
for(int j=x+1;j<=y;j=temp)
{
temp=next[j];//更新下一次的节点,
merge(j-1,j);
next[j]=next[y];//更新每个点下一个区间
}
}
else if(order==3)
{
if(fa(x)==fa(y))
printf("YES\n") ;
else
printf("NO\n");
}
}
return 0;
}