https://vjudge.net/problem/LibreOJ-109/origin
#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e6+10;
int n,m;
int height[maxn];
int s[maxn];
long long mod=998244353;
void init_set()
{
for(int i = 1; i <= n; i++)
{
s[i]=i;
height[i]=0;
}
}
int find_set(int x)
{
if(x!=s[x]) s[x] = find_set(s[x]);
return s[x];
}
void merge_set(int x,int y)
{
x = find_set(x);
y = find_set(y);
if(height[x] == height[y])
{
height[x] = height[x]+1;
s[y]=x;
}else
{
if(height[x] < height[y]) s[x] = y;
else s[y]=x;
}
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin>>n>>m;
init_set();
long long ans=0;
for(int i=0;i<m;i++)
{
int op;
int u,v;
cin>>op>>u>>v;
if(op==0)
{
merge_set(u,v);
}else
{
if(find_set(u)==find_set(v))
{
ans*=2;
ans++;
ans%=mod;
}else
{
ans*=2;
ans%=mod;
}
}
}
cout<<ans<<endl;
return 0;
}