fork download
#include<bits/stdc++.h>
using namespace std;
#define gc getchar_unlocked
#define fo(i,n) for(int i=0;i<n;i++)
#define Fo(i,k,n) for(int i = k ;i<=n;i++)
#define FO(i,n,k) for(int i = n;i>=k;i--)
#define ll long long
#define si(x)   scanf("%d",&x)
#define sl(x)   scanf("%lld",&x)
#define ss(s)   scanf("%s",s)
#define pi(x)   printf("%d\n",x)
#define pl(x)   printf("%lld\n",x)
#define ps(s)   printf("%s\n",s)
#define deb(x) cout << #x << "=" << x << endl
#define deb2(x, y) cout << #x << "=" << x << "," << #y << "=" << y << endl
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define clr(x) memset(x, 0, sizeof(x))
#define mems(a,x) memset(a,x,sizeof(a))
#define sortall(x) sort(all(x))
#define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
#define PI 3.1415926535897932384626
typedef pair<int, int>  pii;
typedef pair<ll, ll>    pl;
typedef vector<int>     vi;
typedef vector<ll>      vl;
typedef vector<pii>     vpii;
typedef vector<pl>      vpl;
typedef vector<vi>      vvi;
typedef vector<vl>      vvl;
mt19937_64 rang(chrono::high_resolution_clock::now().time_since_epoch().count());
int rng(int lim) {
    uniform_int_distribution<int> uid(0, lim - 1);
    return uid(rang);
}
const int mod =   998244353; //1000000007;
const int N = 3e5, M = N;

//vi g[N];
//int a[N];

ll find(vector<ll> &parent, ll a)
{
    return (parent[a] = (parent[a] == a ? a : find(parent, parent[a])));
}

void Union(vector<ll> &parent, vector<ll> &parent2, vector<ll> &rank, vector<ll> &count, vector<ll> &sum, ll a, ll b)
{

    a = find(parent, parent2[a]);

    b = find(parent, parent2[b]);


    if (a == b)
        return;

    if (rank[a] == rank[b])
    {
        rank[a]++;
    }

    if (rank[a] >= rank[b])
    {
        parent[b] = a;
        sum[a] += sum[b];
        count[a] += count[b];
    }
    else
    {
        parent[a] = b;
        sum[b] += sum[a];
        count[b] += count[a];
    }
}

void move(vector<ll> &parent, vector<ll> &parent2, vector<ll> &count, vector<ll> &sum, ll a, ll b)
{
    ll a1 = find(parent, parent2[a]);

    b = find(parent, parent2[b]);

    if (a == b)
        return;

    parent2[a] = b;

    sum[b] += a;
    count[b] += 1;

    sum[a1] -= a;
    count[a1] -= 1;

}

void solve()
{
    ll n, m;
    cin >> n >> m;

    vector<ll> parent(n + 1), parent2(n + 1), count(n + 1), sum(n + 1), rank(n + 1);
    fo(i, n + 1)
    {
        parent[i] = i;
        parent2[i] = i;
        count[i] = 1;
        sum[i] = i;
        rank[i] = 0;
    }

    fo(i, m)
    {
        ll x, y, z;
        cin >> x >> y;
        if (x == 1)
        {
            cin >> z;
            /* code */
            Union(parent, parent2, rank, count, sum, y, z);
        }
        else if (x == 2)
        {
            cin >> z;
            move(parent, parent2, count, sum, y, z);
        }
        else
        {
            y = find(parent, parent2[y]);
            cout << count[y] << " " << sum[y] << endl;
        }
    }
}

int main() {
    //ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    srand(chrono::high_resolution_clock::now().time_since_epoch().count());

    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }

    return 0;
}




Success #stdin #stdout 0s 4968KB
stdin
Standard input is empty
stdout
Standard output is empty