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
| #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;
const int N=2e5+10,INF=0x7fffffff;
struct Node{ int l,r,v,p,dis; #define l(x) tr[x].l #define r(x) tr[x].r #define v(x) tr[x].v #define p(x) tr[x].p #define d(x) tr[x].dis }tr[N]; int idx;
bool cmp(int a,int b) { if (v(a)!=v(b)) return v(a)<v(b); return a<b; }
int merge(int a,int b) { if (!a) return b; if (!b) return a; if (cmp(b,a)) swap(a,b); r(a)=merge(r(a),b); if (d(r(a))>d(l(a))) swap(r(a),l(a)); d(a)=d(r(a))+1; return a; }
int find(int x) { if (p(x)!=x) p(x)=find(p(x)); return p(x); }
int main() { int n,m; scanf("%d %d",&n,&m); for (int i=0,x;i<n;++i) { scanf("%d",&x); v(++idx)=x; d(idx)=1; p(idx)=idx; } v(0)=INF; while (m--) { int t,x,y; scanf("%d %d",&t,&x); if (t==1) { scanf("%d",&y); if (x!=y&&v(x)!=INF&&v(y)!=INF) { x=find(x);y=find(y); if (cmp(y,x)) swap(x,y); p(y)=x; merge(x,y); } } else if (t==2) { if (v(x)==INF) { puts("-1"); continue; } printf("%d\n",v(find(x))); x=find(x); v(x)=INF; if (cmp(r(x),l(x))) swap(l(x),r(x)); p(x)=l(x),p(l(x))=l(x); merge(l(x),r(x)); } } return 0; }
|
Gitalking ...