#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/1/DSL_1_B"
#include"../../../template.h"
#include"../Weighted_Dsu.h"voidsolve(){intn,q;cin>>n>>q;WeightedDsug(n);while(q--){inttype;cin>>type;if(type==0){intx,y,z;cin>>x>>y>>z;g.merge(x,y,z);}elseif(type==1){intx,y;cin>>x>>y;intres=g.getDiff(x,y);if(res!=INT_MAX){cout<<res<<'\n';}else{cout<<"?\n";}}}}
#line 1 "DataStructure/DSU/test/aizu_dsl_1_b_weighted_dsu.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/1/DSL_1_B"
#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/Weighted_Dsu.h"
structWeightedDsu{vector<int>par,sz;vector<ll>diff;WeightedDsu(){}WeightedDsu(intn):par(n+1),sz(n+1,1),diff(n+1){iota(all(par),0);}intfind(intv){if(v==par[v])returnv;intp=par[v];introot=find(p);diff[v]+=diff[p];returnpar[v]=root;}// diff[v] - diff[u] = xvoidmerge(intu,intv,intx){intpu=find(u);intpv=find(v);if(pu==pv)return;if(sz[pu]<sz[pv]){swap(u,v);swap(pu,pv);x=-x;}par[pv]=pu;sz[pu]+=sz[pv];diff[pv]=diff[u]-diff[v]+x;}// diff[v] - diff[u]intgetDiff(intu,intv){intpu=find(u);intpv=find(v);if(pu!=pv)returnINT_MAX;returndiff[v]-diff[u];}};#line 5 "DataStructure/DSU/test/aizu_dsl_1_b_weighted_dsu.test.cpp"
voidsolve(){intn,q;cin>>n>>q;WeightedDsug(n);while(q--){inttype;cin>>type;if(type==0){intx,y,z;cin>>x>>y>>z;g.merge(x,y,z);}elseif(type==1){intx,y;cin>>x>>y;intres=g.getDiff(x,y);if(res!=INT_MAX){cout<<res<<'\n';}else{cout<<"?\n";}}}}