#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class UnionFind { std::vector parent, added; public: UnionFind(int size): parent(size, -1), added(size, 0){} int find(int a) { if (parent[a] < 0) { return a; } else { const auto root = find(parent[a]); if (parent[a] != root) { added[a] += added[parent[a]]; parent[a] = root; } return root; } } void add(int node, int value) { added[find(node)] += value; } void unite(int a, int b) { a = find(a); b = find(b); if (a == b) return; if (parent[a] > parent[b]) std::swap(a, b); parent[a] += parent[b]; parent[b] = a; added[b] -= added[a]; } int value_of(int a) { if (parent[a] < 0) { return added[a]; } else { return added[find(a)] + added[a]; } } }; int main() { std::cin.tie(nullptr); std::ios_base::sync_with_stdio(false); int n, q; std::cin >> n >> q; UnionFind uft(n); for (auto i = 0; i < q; ++i) { int t, a, b; std::cin >> t >> a >> b; switch(t) { case 1: uft.unite(a - 1, b - 1); break; case 2: uft.add(a - 1, b); break; case 3: std::cout << uft.value_of(a - 1) << '\n'; break; default: throw 0; } } }