/* confirm 0LL and 1LL confirm cornercases such as 0 confirm times of cin < 10^6 */ #include using namespace std; using ll = long long; using ld = long double; using P = pair; using Pld = pair; using Vec = vector; using VecP = vector

; using VecB = vector; using VecC = vector; using VecD = vector; using VecS = vector; using Graph = vector; template using Vec1 = vector; template using Vec2 = vector >; #define REP(i, m, n) for(ll i = (m); (i) < (n); ++(i)) #define REPN(i, m, n) for(ll i = (m); (i) <= (n); ++(i)) #define REPR(i, m, n) for(ll i = (m)-1; (i) >= (n); --(i)) #define REPNR(i, m, n) for(ll i = (m); (i) >= (n); --(i)) #define rep(i, n) REP(i, 0, n) #define repn(i, n) REPN(i, 1, n) #define repr(i, n) REPR(i, n, 0) #define repnr(i, n) REPNR(i, n, 1) #define all(s) (s).begin(), (s).end() #define pb push_back #define fs first #define sc second template bool chmax(T &a, const T b){if(a < b){a = b; return true;} return false;} template bool chmin(T &a, const T b){if(a > b){a = b; return true;} return false;} template ll pow2(const T n){return (1LL << n);} template void cosp(const T n){cout << n << ' ';} void co(void){cout << '\n';} template void co(const T n){cout << n << '\n';} template void co(pair p){cout << p.fs << ' ' << p.sc << '\n';} template void co(const Vec1 &v){for(T i : v) cosp(i); co();} template void co(initializer_list v){for(T i : v) cosp(i); co();} template void ce(const T n){cerr << n << endl;} void sonic(){ios::sync_with_stdio(false); cin.tie(0);} void setp(const ll n){cout << fixed << setprecision(n);} constexpr int INF = 1e9+1; constexpr ll LINF = 1e18+1; constexpr ll MOD = 1e9+7; //constexpr ll MOD = 998244353; constexpr ld EPS = 1e-11; const ld PI = acos(-1); struct UnionFind{ Vec par; Vec sum; ll var; UnionFind(ll n){ par.resize(2000000); sum.assign(2000000, 0); rep(i, 2000000) par[i] = i; var = n; } ll root(ll x){ if(par[x] == x) return x; ll p = root(par[x]); if(p != par[x]) sum[x] += sum[par[x]]; return par[x] = p; } void unite(ll x, ll y){ x = root(x), y = root(y); if(x != y){ par[x] = var; par[y] = var; var++; } } bool same(ll x, ll y){ return root(x) == root(y); } void add(ll a, ll b){ sum[root(a)] += b; } ll query(ll x){ if(x == root(x)) return sum[x]; return sum[root(x)] + sum[x]; } }; int main(void){ sonic(); ll n, q; cin >> n >> q; UnionFind uf(n); rep(i, q){ ll t, a, b; cin >> t >> a >> b; if(t == 1){ a--, b--; uf.unite(a, b); }else if(t == 2){ a--; uf.add(a, b); }else{ a--; co(uf.query(a)); } } return 0; }