Question:
Three operations.
1. merge two sets
2. Place the first element in the second set.
3. Number and sum of output sets ..
Train of Thought Analysis:
Use p to record the number of the set where this element is located, and then create and query the set with the number.
#include
#include
#include #include
using namespace std;typedef long long LL;int set[111111];int cnt[111111];LL sum[111111];int p[111111];int find(int x){ if(x!=set[x]) set[x]=find(set[x]); return set[x];}int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++)set[i]=i,cnt[i]=1,sum[i]=i,p[i]=i; while(m--) { int op; scanf("%d",&op); int l,r; if(op==1) { scanf("%d%d",&l,&r); int xx=find(p[l]); int yy=find(p[r]); if(xx==yy)continue; else { set[xx]=yy; cnt[yy]+=cnt[xx]; sum[yy]+=sum[xx]; } } else if(op==2) { scanf("%d%d",&l,&r); int xx=find(p[l]); int yy=find(p[r]); if(xx==yy)continue; else { sum[xx]-=l; cnt[xx]--; sum[yy]+=l; cnt[yy]++; p[l]=yy; } } else { scanf("%d",&l); printf("%d %lld\n",cnt[find(p[l])],sum[find(p[l])]); } } } return 0;}