This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/1/DSL_1_B"
#include "../DataStructure/potentialized_union_find.hpp"
#include <iostream>
int main() {
std::cin.tie();
std::ios::sync_with_stdio(false);
int n, q;
std::cin >> n >> q;
PotentializedUnionFind<int> puf(n);
while (q--) {
int t, u, v;
std::cin >> t >> u >> v;
if (t == 0) {
int d;
std::cin >> d;
puf.unite(v, u, d);
} else {
if (!puf.same(u, v)) {
std::cout << "?\n";
} else {
std::cout << puf.diff(v, u) << "\n";
}
}
}
return 0;
}#line 1 "Verify/potentialized_union_find.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/1/DSL_1_B"
#line 2 "DataStructure/potentialized_union_find.hpp"
#include <vector>
template <class Dist>
struct PotentializedUnionFind {
std::vector<int> par;
std::vector<Dist> dist; // A[par[v]] - A[v] = dist[v]
int gnum;
explicit PotentializedUnionFind(int n)
: par(n, -1), dist(n, 0), gnum(n) {}
int find(int v) {
if (par[v] < 0) {
return v;
} else {
auto p = find(par[v]);
dist[v] += dist[par[v]];
return par[v] = p;
}
}
// A[u] - A[v] = d
void unite(int u, int v, Dist d) {
auto pu = find(u), pv = find(v);
d += dist[u];
d -= dist[v];
u = pu, v = pv;
if (u == v) return;
if (par[u] > par[v]) {
std::swap(u, v);
d = -d;
}
par[u] += par[v];
par[v] = u;
dist[v] = d;
--gnum;
}
// A[u] - A[v]
Dist diff(int u, int v) {
find(u), find(v);
return dist[v] - dist[u];
}
bool same(int u, int v) { return find(u) == find(v); }
bool ispar(int v) { return v == find(v); }
int size(int v) { return -par[find(v)]; }
};
#line 4 "Verify/potentialized_union_find.test.cpp"
#include <iostream>
int main() {
std::cin.tie();
std::ios::sync_with_stdio(false);
int n, q;
std::cin >> n >> q;
PotentializedUnionFind<int> puf(n);
while (q--) {
int t, u, v;
std::cin >> t >> u >> v;
if (t == 0) {
int d;
std::cin >> d;
puf.unite(v, u, d);
} else {
if (!puf.same(u, v)) {
std::cout << "?\n";
} else {
std::cout << puf.diff(v, u) << "\n";
}
}
}
return 0;
}