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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp>
inline char read() { static const int IN_LEN = 1000000; static char buf[IN_LEN], *s, *t; s == t ? t = (s = buf) + fread(buf, 1, IN_LEN, stdin) : 0; return s == t ? -1 : *s++; }
template<class T> inline void read(T &x) { static char c; static bool iosig; for (c = read(), iosig = false; !isdigit(c); c = read()) { if (c == -1) return; c == '-' ? iosig = true : 0; } for (x = 0; isdigit(c); c = read()) x = (x + (x << 2) << 1) + (c ^ '0'); iosig ? x = -x : 0; }
const int OUT_LEN = 1000000;
char obuf[OUT_LEN], *oh = obuf;
inline void print(char c) { oh == obuf + OUT_LEN ? (fwrite(obuf, 1, OUT_LEN, stdout), oh = obuf) : 0; *oh++ = c; }
template<class T> inline void print(T x) { static int buf[30], cnt; if (x == 0) { print('0'); } else { if (x < 0) print('-'), x = -x; for (cnt = 0; x; x /= 10) buf[++cnt] = x % 10 + 48; while (cnt) print((char)buf[cnt--]); } }
inline void flush() { fwrite(obuf, 1, oh - obuf, stdout); }
namespace Task {
const int MAXN = 100005;
int fa[MAXN], rank[MAXN]; typedef __gnu_pbds::tree<int, int, std::less<int>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> Tree; Tree t[MAXN];
inline int get(int x) { register int p = x, i; while (p != fa[p]) p = fa[p]; while (p != x) i = fa[x], fa[x] = p, x = i; return p; }
inline void put(int x, int y) { if ((x = get(x)) != (y = get(y))) { rank[x] > rank[y] ? (std::swap(x, y), 0) : 0; fa[x] = y; for (Tree::iterator it = t[x].begin(); it != t[x].end(); it++) t[y][it->first] = it->second; rank[x] == rank[y] ? rank[y]++ : 0; t[x].clear(); } }
inline int query(int x, int k) { return k > t[x = get(x)].size() ? -1 : t[get(x)].find_by_order(k - 1)->second; }
inline void solve() { register int n, m, q; read(n), read(m); for (register int i = 1, a; i <= n; i++) read(a), fa[i] = i, t[i][a] = i; for (register int i = 1, x, y; i <= m; i++) read(x), read(y), put(x, y); read(q); register char c; while (q--) { c = read(); while (isspace(c)) c = read(); switch (c) { case 'B': read(n), read(m), put(n, m); break; case 'Q': read(n), read(m); print(query(n, m)), print('\n'); break; } } }
}
int main() { Task::solve(), flush(); return 0; }
|