萌新瞎写的,求调,thx!
#include<bits/stdc++.h>
#define N 200009
using namespace std;
typedef long long ll;
ll n,m,id[N],d[N],pos[N];
ll find(ll x){return id[x]==x?x:find(id[x]);}//^??
struct edge{
ll x,y;
bool operator<(const edge&a) const{
return a.x<x||(a.x==x&&a.y<y);
}
};
map<edge,ll> mp;
void unite(ll x,ll y,ll o){
ll a=find(x),b=find(y);
if(a==b) return;
mp[(edge){x,y}]=mp[(edge){y,x}]=a;
if(rand()&1) id[a]=b;
else id[b]=a,mp[(edge){x,y}]=mp[(edge){y,x}]=b;
}
void del(ll x,ll y){
ll w=mp[(edge){x,y}];
id[w]=w;
mp[(edge){x,y}]=mp[(edge){y,x}]=0;
}
ll read(){
ll x=0;
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x;
}
char gc(){
char c=getchar();
while(c<'A'||c>'Z') c=getchar();
return c;
}
int main(){
freopen(".in","r",stdin);
freopen(".out","w",stdout);
srand(time(0));
n=read(),m=read();
for(ll i=1;i<=n;++i) id[i]=i;
for(ll i=1;i<=m;++i){
// printf("%lld\n",i);
char c;
ll x,y;
c=gc(),x=read(),y=read();
if(c=='C') unite(x,y,i);
//// cout<<"C:"<<x<<" "<<y<<"\n";
if(c=='Q'){
if(find(x)==find(y))puts("Yes");
else puts("No");
cout<<x<<":"<<find(x)<<" "<<y<<":"<<find(y)<<"\n";
}
if(c=='D') del(x,y);
}
return 0;
}