1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
#include<cmath> using namespace std; const int N=30050; int fa[N],d[N],sz[N]; inline int () { register int x=0,t=1; register char ch=getchar(); while (ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if (ch=='-') t=-1,ch=getchar(); while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t; } inline char get() { register char ch=getchar(); while (ch!='M'&&ch!='C') ch=getchar(); return ch; } int find(int x) { if (fa[x]==x) return x; find(fa[x]); d[x]+=d[fa[x]]; return fa[x]=find(fa[x]); } void unite(int u,int v) { u=find(u),v=find(v); fa[u]=v; d[u]=d[v]+sz[v]; sz[v]+=sz[u]; } int ask(int u,int v) { if (find(u)!=find(v)) return -1; return abs(d[u]-d[v])-1; } void init() { for(int i=1;i<N;i++) fa[i]=i,d[i]=0,sz[i]=1; } int main() { init(); int T=read(); while (T--) { char opt=get(); int u=read(),v=read(); if (opt=='M') unite(u,v); if (opt=='C') printf("%dn",ask(u,v)); } return 0; }
|
近期评论