【模板】斜堆
如题这是一个模板。。。
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <cctype> 6 7 inline void read(int & x) 8 { 9 x = 0; 10 int k = 1; 11 char c = getchar(); 12 while (!isdigit(c)) 13 if (c == '-') c = getchar(), k = -1; 14 else c = getchar(); 15 while (isdigit(c)) 16 x = (x << 1) + (x << 3) + (c ^ 48), 17 c = getchar(); 18 x *= k; 19 } 20 21 const int MAXN = 100010; 22 int n, m, opt, x, y, tot = 0; 23 int faz[MAXN], son[MAXN][2], val[MAXN]; 24 25 inline int Find(int u) 26 { 27 while (faz[u]) u = faz[u]; 28 return u; 29 } 30 31 int Merge(int a, int b) 32 { 33 if (!a || !b) { return a + b; } 34 if (val[a] > val[b] || (val[a] == val[b] && a > b)) 35 std::swap(a, b); 36 son[a][1] = Merge(son[a][1], b); 37 faz[son[a][1]] = a; 38 std::swap(son[a][1], son[a][0]); 39 return a; 40 } 41 42 int qa, qb, cc; 43 44 inline void Merge_opt(int aa, int bb) 45 { 46 if (val[aa] == -1 || val[bb] == -1) return; 47 qa = Find(aa), qb = Find(bb); 48 if (qa == qb) return; 49 Merge(qa, qb); 50 } 51 52 signed main() 53 { 54 read(n), read(m); 55 for (int i = 1; i <= n; ++i) 56 read(val[i]); 57 for (int i = 1; i <= m; ++i) 58 { 59 read(opt), read(x); 60 if (opt == 1) read(y), Merge_opt(x, y); 61 else 62 { 63 if (val[x] == -1) {puts("-1"); continue;} 64 y = Find(x); 65 printf("%d\n", val[y]); 66 faz[son[y][0]] = faz[son[y][1]] = 0; 67 val[y] = -1; 68 Merge_opt(son[y][0], son[y][1]); 69 } 70 } 71 return 0; 72 }