#include #include #include using namespace std; using ll = long long; using ull = unsigned long long; static inline ll fast_read() { int c = getchar_unlocked(); while (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f') { c = getchar_unlocked(); } bool negative = false; if (c == '-' || c == '+') { negative = c == '-'; c = getchar_unlocked(); } ull value = 0; while ('0' <= c && c <= '9') { value = value * 10 + (ull)(c - '0'); c = getchar_unlocked(); } if (c != EOF) { ungetc(c, stdin); } return negative ? -(ll)value : (ll)value; } static inline void fast_write(ll v) { char buf[24]; int n = 0; ull u = v < 0 ? 0ULL - (ull)v : (ull)v; if (v < 0) { putchar_unlocked('-'); } do { buf[n++] = (char)('0' + u % 10); u /= 10; } while (u); while (n) { putchar_unlocked(buf[--n]); } putchar_unlocked('\n'); } int main() { ll n, q; n = fast_read(); q = fast_read(); vector> gs(n); for (ll i = 0; i < n; i++) { gs[i] = {i}; } vector gn(n, 0), vn(n, 0), v2g(n); for (ll i = 0; i < n; i++) { v2g[i] = i; } for (ll k = 0; k < q; k++) { ll t, a, b; t = fast_read(); a = fast_read(); b = fast_read(); if (t == 1) { a--; b--; if (v2g[a] == v2g[b]) { continue; } if (!(gs[v2g[a]].size() < gs[v2g[b]].size())) { swap(a, b); } ll i = v2g[a], j = v2g[b]; ll m_i = gn[i], m_j = gn[j]; vector ga = move(gs[i]); gs[i] = {}; for (ll v : ga) { v2g[v] = j; } for (ll v : ga) { vn[v] += m_i - m_j; } gs[j].insert(gs[j].end(), ga.begin(), ga.end()); } else if (t == 2) { a--; gn[v2g[a]] += b; } else { a--; fast_write(vn[a] + gn[v2g[a]]); } } }