839模拟堆
n = int(input())
N,idx,size=100010,0,0
hp,ph,h=[0]*N,[0]*N,[0]*N
def swap(a,b):
ph[hp[a]],ph[hp[b]] = b,a
hp[a],hp[b] = hp[b],hp[a]
h[a],h[b] = h[b], h[a]
def down(u):
global size
t = u
if 2*u<=size and h[2*u]<h[t]:
t = 2*u
if 2*u+1<=size and h[2*u+1]<h[t]:
t = 2*u+1
if t!=u:
swap(t,u)
down(t)
def insert(x):
global size,idx
idx += 1
size += 1
h[size] = x
hp[size] =idx
ph[idx] = size
up(size)
def up(x):
while x//2 and h[x//2]>h[x]:
swap(x//2,x)
x//=2
for _ in range(n):
op, *pt = input().split()
if op=='I':
x = int(pt[0])
insert(x)
elif op=='PM':
print(h[1])
elif op=='DM':
swap(size,1)
size -= 1
down(1)
elif op=='D':
k = int(pt[0])
k = ph[k]
swap(size,k)
size-=1
up(k)
down(k)
else:
k,x = map(int, pt)
k = ph[k]
h[k] = x
down(k)
up(k)
837 连通块中点的数量
n,m = map(int,input().split())
N = 100010
p = [x for x in range(N)]
cnt = [1]*N
def find(x):
if p[x]!=x:
p[x] = find(p[x])
return p[x]
def merge(a,b):
if find(a)!=find(b):
cnt[find(b)]+=cnt[find(a)]
p[find(a)] = find(b)
def Q1(a,b):
if find(a)==find(b):
print('Yes')
else:
print('No')
def Q2(a):
print(cnt[find(a)])
for _ in range(m):
op, *pt = input().split()
if op=='C':
a,b = map(int,pt)
merge(a,b)
elif op=='Q1':
a,b = map(int,pt)
Q1(a,b)
else:
a = int(pt[0])
Q2(a)