Buggy python submission (verdict: Time Limit Exceeded):
N, M = map(int, input().split(' '))
H = list(map(int, input().split(' ')))
MICHI = []

# 10**5回
for m in range(M):
    MICHI.append(tuple(map(int, input().split(' '))))

# 展望台接続関係マップ
setsuzokumap = [[0 for i in range(N)] for j in range(N)]
setsuzokumap_d = {}

# 10**5回
for m in MICHI:
    # setsuzokumap[m[0] - 1][m[1] - 1] = 1
    k = (m[0] - 1, m[1] - 1)

    setsuzokumap_d.update({k: 1})

# print(setsuzokumap_d)

good_tenboudai = [None] * N

# すべての展望台を調べる
for n in range(N):
    # 未判断の展望台を調べる
    if good_tenboudai[n] is None:
        # すべての接続パターンを調べる
        for m in range(N):
            # 接続あり
            try:
                if setsuzokumap_d[(n, m)] == 1:
                    # 接続先が良い展望台ならば、この展望台は自動的によくない
                    if good_tenboudai[m] == 1:
                        good_tenboudai[n] = 0
                    else:
                        # 接続先の高さが自分以下だったら接続先は必ずよくない
                        if H[m] <= H[n]:
                            good_tenboudai[m] = 0

                        # 自分の高さが接続先以下だったらよくない
                        if H[n] <= H[m]:
                            good_tenboudai[n] = 0

            except KeyError:
                pass

            # 最後まで良くないと判定されなかったのが良いの
for n in range(N):
    if good_tenboudai[n] is None:
        good_tenboudai[n] = 1

print(sum(good_tenboudai))


Fixed submission:
N, M = map(int, input().split(' '))
H = list(map(int, input().split(' ')))
MICHI = []

# 10**5回
for m in range(M):
    MICHI.append(tuple(map(int, input().split(' '))))

# 展望台接続関係マップ
# setsuzokumap = [[0 for i in range(N)] for j in range(N)]
setsuzokumap_d = {}
setsuzokumap_me = [[] for j in range(N)]

# 10**5回
for m in MICHI:
    # setsuzokumap[m[0] - 1][m[1] - 1] = 1
    # k = (m[0] - 1, m[1] - 1)

    setsuzokumap_me[m[0] - 1].append(m[1] - 1)
    setsuzokumap_me[m[1] - 1].append(m[0] - 1)

    # setsuzokumap_d.update({k: 1})

# print(setsuzokumap_d)

good_tenboudai = [None] * N

# すべての展望台を調べる
# 10**5
for n in range(N):
    # 未判断の展望台を調べる
    if good_tenboudai[n] is None:
        # すべての接続パターンを調べる
        if setsuzokumap_me[n]:
            # 最大10**5
            for setsuzokusaki in setsuzokumap_me[n]:

                m = setsuzokusaki

                # 接続先が良い展望台ならば、この展望台は自動的によくない
                if good_tenboudai[m] == 1:
                    good_tenboudai[n] = 0
                else:
                    # 接続先の高さが自分以下だったら接続先は必ずよくない
                    if H[m] <= H[n]:
                        good_tenboudai[m] = 0

                    # 自分の高さが接続先以下だったらよくない
                    if H[n] <= H[m]:
                        good_tenboudai[n] = 0


# 最後まで良くないと判定されなかったのが良いの
# 10**5
for n in range(N):
    if good_tenboudai[n] is None:
        good_tenboudai[n] = 1

# print(good_tenboudai)
print(sum(good_tenboudai))

Buggy python submission (verdict: Time Limit Exceeded):
N, M = map(int, input().split(' '))
H = list(map(int, input().split(' ')))
MICHI = []
for m in range(M):
    MICHI.append(tuple(map(int, input().split(' '))))

# 展望台接続関係マップ
setsuzokumap = [[0 for i in range(N)] for j in range(N)]

for m in MICHI:
    setsuzokumap[m[0] - 1][m[1] - 1] = 1

# print(setsuzokumap)

good_tenboudai = [None] * N

# すべての展望台を調べる
for n in range(N):
    # 未判断の展望台を調べる
    if good_tenboudai[n] is None:
        # すべての接続パターンを調べる
        for m in range(N):
            # 接続あり
            if setsuzokumap[n][m] == 1:
                # 接続先が良い展望台ならば、この展望台は自動的によくない
                if good_tenboudai[m] == 1:
                    good_tenboudai[n] = 0
                else:
                    # 接続先の高さが自分以下だったら接続先は必ずよくない
                    if H[m] <= H[n]:
                        good_tenboudai[m] = 0

                    # 自分の高さが接続先以下だったらよくない
                    if H[n] <= H[m]:
                        good_tenboudai[n] = 0

# 最後まで良くないと判定されなかったのが良いの
for n in range(N):
    if good_tenboudai[n] is None:
        good_tenboudai[n] = 1

print(sum(good_tenboudai))


Fixed submission:
N, M = map(int, input().split(' '))
H = list(map(int, input().split(' ')))
MICHI = []

# 10**5回
for m in range(M):
    MICHI.append(tuple(map(int, input().split(' '))))

# 展望台接続関係マップ
# setsuzokumap = [[0 for i in range(N)] for j in range(N)]
setsuzokumap_d = {}
setsuzokumap_me = [[] for j in range(N)]

# 10**5回
for m in MICHI:
    # setsuzokumap[m[0] - 1][m[1] - 1] = 1
    # k = (m[0] - 1, m[1] - 1)

    setsuzokumap_me[m[0] - 1].append(m[1] - 1)
    setsuzokumap_me[m[1] - 1].append(m[0] - 1)

    # setsuzokumap_d.update({k: 1})

# print(setsuzokumap_d)

good_tenboudai = [None] * N

# すべての展望台を調べる
# 10**5
for n in range(N):
    # 未判断の展望台を調べる
    if good_tenboudai[n] is None:
        # すべての接続パターンを調べる
        if setsuzokumap_me[n]:
            # 最大10**5
            for setsuzokusaki in setsuzokumap_me[n]:

                m = setsuzokusaki

                # 接続先が良い展望台ならば、この展望台は自動的によくない
                if good_tenboudai[m] == 1:
                    good_tenboudai[n] = 0
                else:
                    # 接続先の高さが自分以下だったら接続先は必ずよくない
                    if H[m] <= H[n]:
                        good_tenboudai[m] = 0

                    # 自分の高さが接続先以下だったらよくない
                    if H[n] <= H[m]:
                        good_tenboudai[n] = 0


# 最後まで良くないと判定されなかったのが良いの
# 10**5
for n in range(N):
    if good_tenboudai[n] is None:
        good_tenboudai[n] = 1

# print(good_tenboudai)
print(sum(good_tenboudai))