#define PROBLEM "https://judge.yosupo.jp/problem/unionfind_with_potential"
#include"../template.h"
#include"DSU/Dsu.h"voidsolve(){intn,q;cin>>n>>q;Dsug(n);while(q--){inttv,u,v;cin>>tv>>u>>v;if(tv==0){intx;cin>>x;cout<<(g.mergePotential(u,v,x,mod)?1:0)<<"\n";}else{cout<<g.getDiff(u,v,mod)<<'\n';}}}
#line 1 "DataStructure/Unionfind_with_potential.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/unionfind_with_potential"
#line 2 "template.h"
#include<bits/stdc++.h>usingnamespacestd;#define ll long long
#define MOD (ll)(1e9+7)
#define all(x) (x).begin(),(x).end()
#define unique(x) x.erase(unique(all(x)), x.end())
#define INF32 ((1ull<<31)-1)
#define INF64 ((1ull<<63)-1)
#define inf (ll)1e18
#define vi vector<int>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
constintmod=998244353;voidsolve();intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);// cin.exceptions(cin.failbit);// int t; cin >> t;// while(t--)solve();cerr<<"\nTime run: "<<1000*clock()/CLOCKS_PER_SEC<<"ms"<<'\n';return0;}#line 2 "DataStructure/DSU/Dsu.h"
/* Diff: different between a[u] and a[par[u]] */structDsu{vector<int>par,sz;vector<ll>diff;Dsu(){}Dsu(intn):par(n+1),sz(n+1,1),diff(n+1){iota(all(par),0);}intfind(intv){if(v==par[v])returnv;returnpar[v]=find(par[v]);}voidmerge(inta,intb){a=find(a);b=find(b);if(a==b)return;if(sz[a]<sz[b])swap(a,b);par[b]=a;sz[a]+=sz[b];}boolsame_component(intu,intv){returnfind(u)==find(v);}intcomponent_size(intu){u=find(u);returnsz[u];}/* https://judge.yosupo.jp/problem/unionfind_with_potential */intfindPotential(intv,intmod){if(v==par[v])returnv;intp=par[v];introot=findPotential(p,mod);diff[v]=(diff[v]+diff[p])%mod;returnpar[v]=root;}boolmergePotential(intu,intv,intx,intmod){intpu=findPotential(u,mod);intpv=findPotential(v,mod);if(pu==pv){return(diff[u]-diff[v]+mod)%mod==x;}if(sz[pu]<sz[pv]){swap(u,v);swap(pu,pv);x=(mod-x)%mod;}par[pv]=pu;sz[pu]+=sz[pv];diff[pv]=((diff[u]-diff[v]-x)%mod+mod)%mod;returntrue;}intgetDiff(intu,intv,intmod){intpu=findPotential(u,mod);intpv=findPotential(v,mod);if(pu!=pv)return-1;return(diff[u]-diff[v]+mod)%mod;}};#line 5 "DataStructure/Unionfind_with_potential.test.cpp"
voidsolve(){intn,q;cin>>n>>q;Dsug(n);while(q--){inttv,u,v;cin>>tv>>u>>v;if(tv==0){intx;cin>>x;cout<<(g.mergePotential(u,v,x,mod)?1:0)<<"\n";}else{cout<<g.getDiff(u,v,mod)<<'\n';}}}