Rt,O(N2)艹过去了,没用任何数据结构/kel。
求Hack
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
using namespace std;
int n,q,h[N],tot,v[N],f[N],fa[N],g[N],sz[N];char s[2];
struct node{bool op;int x,y;}a[N];
struct edge{int to,nxt;}e[N<<1];
void adde(int x,int y){e[++tot].nxt=h[x];h[x]=tot;e[tot].to=y;}
void dfs(int x){
v[x]=1;
for(int i=h[x];i;i=e[i].nxt)
if(e[i].to!=f[x])f[e[i].to]=x,dfs(e[i].to);
}
int get(int x){return g[x]==x?x:g[x]=get(g[x]);}
void add(int x,int val){
while(x)sz[x]+=val,x=fa[x];
}
int main(){
scanf("%d%d",&n,&q);
rep(i,1,q){
scanf("%s%d%d",s,&a[i].x,&a[i].y);
if(*s=='A')a[i].op=0,adde(a[i].x,a[i].y),adde(a[i].y,a[i].x);
else a[i].op=1;
}
rep(i,1,n){sz[i]=1;g[i]=i;if(!v[i])dfs(i);}
rep(i,1,q){
if(a[i].op){
if(fa[a[i].x]==a[i].y)printf("%d\n",sz[a[i].x]*(sz[get(a[i].y)]-sz[a[i].x]));
else printf("%d\n",sz[a[i].y]*(sz[get(a[i].x)]-sz[a[i].y]));
}
else{
if(f[a[i].x]==a[i].y)fa[a[i].x]=a[i].y,g[a[i].x]=g[a[i].y],add(a[i].y,sz[a[i].x]);
else fa[a[i].y]=a[i].x,g[a[i].y]=g[a[i].x],add(a[i].x,sz[a[i].y]);
}
}
return 0;
}