#include?
<
iostream
>
using
?
namespace
?std;
int
?n,?m;
#define
?N??200010
#define
?lowbit(x)??(?(x)&(-(x))?)
struct
?TArray{
????
int
?cnt[N];
????TArray(){?init();?}
????
void
?update(?
int
?p,?
int
?v?){
????????
for
(?
int
?x
=
?p;?x
<=
?n;?cnt[x]
+=
?v,?x
+=
?lowbit(x)?);?}
????
int
??sum(?
int
?p?){
????????
int
?x
=
?p,?s
=
?
0
;
????????
for
(?;?x;?s
+=
?cnt[x],?x
-=
?lowbit(x)?);
????????
return
?s;?}
????
int
??rank(?
int
?k?){
????????k
=
?sum(n)
+
?
1
-
?k;
????????
int
?left
=
?
1
,?right
=
?n;
????????
while
(?left
+
?
1
<
?right?){
????????????
int
?m
=
?(left
+
?right)
>>
?
1
;
????????????
int
?s
=
?sum(m);
????????????
if
(?s
>=
?k?)?right
=
?m;
????????????
else
????????left
=
?m;
????????}
????????
if
(?sum(left)
>=
?k?)?
return
?left;
????????
return
?right;
????}
????
void
?init(){??
for
(
int
?i
=
?
0
;?i
<=
?n;?
++
i?)?cnt[i]
=
?
0
;?}
};
TArray?tay;
struct
?U_find{
????
int
?find[N],?num[N];
????U_find(){?clear();}
????
int
?parent(?
int
?t?){?
????????
int
?u
=
?t,?v;???
while
(?u
!=
?find[u]?)?u
=
?find[u];
????????
while
(?t
!=
?u?)?{?v
=
?find[t];?find[t]
=
?u;?t
=
?find[v];?}
????????
return
?u;??}
????
bool
?is_friend(?
int
?u,?
int
?v?){?
return
?parent(u)
==
?parent(v);?}
????
void
?set_friend(?
int
?u,?
int
?v?){
????????
int
?a
=
?parent(u),?b
=
?parent(v);
????????
if
(?a
==
?b?)?
return
;
????????
if
(?num[a]
>
?num[b]?)?{?
????????????find[b]
=
?a;??
????????????tay.update(?num[b],?
-
1
?);
????????????tay.update(?num[a],?
-
1
?);
????????????num[a]
+=
?num[b];
????????????tay.update(?num[a],?
1
?);
????????}
????????
else
?{
????????????find[a]
=
?b;
????????????tay.update(??num[a],?
-
1
?);
????????????tay.update(??num[b],?
-
1
?);
????????????num[b]
+=
?num[a];
????????????tay.update(?num[b],?
1
?);
????????}
????}
????
void
?clear(){?
for
(?
int
?i
=
?
0
;?i
<
?N;?
++
i?)?find[i]
=
?i,?num[i]
=
?
1
;?}
};
U_find?uf;
int
?main(){
????scanf(
"
%d%d
"
,
&
n,
&
m?);
????tay.update(?
1
,?n?);
????
????
while
(?m
--
?){
????????
int
?t,?u,?v,?k;
????????scanf(
"
%d
"
,
&
t?);
????????
if
(?t
==
?
0
?){
????????????scanf(
"
%d%d
"
,
&
u,
&
v?);
????????????uf.set_friend(?u,?v??);
????????}
????????
else
{
????????????scanf(
"
%d
"
,
&
k?);
????????????printf(
"
%d\n
"
,?tay.rank(k)?);
????????}
????}
????
return
?
0
;
}
posted on 2009-07-14 13:31
Darren 閱讀(305)
評論(0) 編輯 收藏 引用 所屬分類:
數(shù)據(jù)結構