维护一个数组pre[i],表示比i小且与i属于不同组的最大值。
//#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
void read(int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
const int MAXN=200200;
int fa[MAXN],pre[MAXN];
int findfa(int x)
{
return fa[x]==x?x:fa[x]=findfa(fa[x]);
}
int main()
{
int n,q,i,x,y,type;
while(~scanf("%d%d",&n,&q))
{
for(i=1;i<=n;i++)
{
fa[i]=i;
pre[i]=i-1;
}
while(q--)
{
read(type);read(x);read(y);
if(type==1)
{
fa[findfa(x)]=findfa(y);
for(i=x;pre[i]>=1&&findfa(i)==findfa(pre[i]);pre[i]=pre[pre[i]]);
for(i=y;pre[i]>=1&&findfa(i)==findfa(pre[i]);pre[i]=pre[pre[i]]);
}
else if(type==2)
{
for(i=y;pre[i]>=x;pre[i]=pre[pre[i]])
fa[findfa(i)]=findfa(pre[i]);
}
else if(type==3)
{
if(findfa(x)==findfa(y))
printf("YES\n");
else
printf("NO\n");
}
}
}
}