並查集好題,維護兩個值,一個是所處隊列大小,一個是每個結點隊列前面還有幾個數。
第二個維護需要巧妙的搞一搞,見find函數
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i<n;++i)
#define for1(i,n) for(int i=1;i<=n;++i)
#define IO ios::sync_with_stdio(false);cin.tie(0)
const int maxn = 3e4+5;
int par[maxn],sz[maxn],front[maxn];
void init(){
forn(i,maxn) par[i] = i,sz[i] = 1,front[i] = 0;
}
int find(int x){
if(par[x] == x) return x;
int fx = find(par[x]);
front[x] += front[par[x]];
return par[x] = fx;
}
int main(){
IO;init();
int t;cin>>t;while(t--){
char op;int x,y;cin>>op>>x>>y;
int fx = find(x),fy = find(y);
if(op=='M'){
front[fx] += sz[fy];
sz[fy] += sz[fx];
par[fx] = fy;
}else{
if(fx!=fy) cout<<-1<<'\n';
else cout<<abs(front[x]-front[y])-1<<'\n';
}
}
return 0;
}