2操作为关键
首先通过next[n]数组保存每个点之后(右)下一个要更新的点的下标
若该点的下标超出范围 则再无需操作
using namespace std;
int f[200010],next[200010];
int n;
int getf(int p)
{
if(f[p]==p) return p;
else
{
f[p]=getf(f[p]);
return f[p];
}
}
void unite(int x,int y)
{
int fx,fy;
fx=getf(x);
fy=getf(y);
if(fx!=fy)
{
f[fy]=fx;
}
return;
}
int main()
{
int q,i,op,t,x,y,fx,fy;
while(scanf("%d%d",&n,&q)!=EOF)
{
for(i=1;i<=n;i++)
{
f[i]=i;
next[i]=i+1;
}
while(q--)
{
scanf("%d%d%d",&op,&x,&y);
if(op==1)
{
unite(x,y);
}
else if(op==2)
{
unite(x,y);
while(next[x]<=y)
{
unite(x,next[x]);
t=next[x],next[x]=next[y],x=t;
}
}
else
{
fx=getf(x);
fy=getf(y);
if(fx==fy) printf("YES\n");
else printf("NO\n");
}
}
}
return 0;
}