test/1O.py
2026-07-01 19:46:51 +03:00

101 lines
No EOL
2.1 KiB
Python

import sys
from collections import deque
reader = (int(token) for line in sys.stdin for token in line.split())
n = next(reader)
m = next(reader)
A = next(reader)
B = next(reader)
w = []
e = []
for i in range(n):
x = next(reader)
y = next(reader)
if x == 0:
w.append((y, i))
elif x == A:
e.append((y, i))
max_e = 2 * m
head = [-1] * n
rhead = [-1] * n
to = [0] * max_e
nxt = [0] * max_e
rto = [0] * max_e
rnxt = [0] * max_e
ec = 0
rec = 0
for _ in range(m):
u = next(reader) - 1
v = next(reader) - 1
k = next(reader)
to[ec] = v
nxt[ec] = head[u]
head[u] = ec
ec += 1
rto[rec] = u
rnxt[rec] = rhead[v]
rhead[v] = rec
rec += 1
if k == 2:
to[ec] = u
nxt[ec] = head[v]
head[v] = ec
ec += 1
rto[rec] = v
rnxt[rec] = rhead[u]
rhead[u] = rec
rec += 1
vis = [False] * n
q = deque([i for y, i in w])
for i in q:
vis[i] = True
while q:
v = q.popleft()
idx = head[v]
while idx != -1:
t = to[idx]
if not vis[t]:
vis[t] = True
q.append(t)
idx = nxt[idx]
valid_e = [(y, i) for y, i in e if vis[i]]
valid_e.sort()
mx = [-1] * n
q = deque()
for i in range(len(valid_e) - 1, -1, -1):
_, node = valid_e[i]
if mx[node] == -1:
mx[node] = i
q.append(node)
while q:
v = q.popleft()
idx = rhead[v]
while idx != -1:
t = rto[idx]
if mx[t] == -1:
mx[t] = i
q.append(t)
idx = rnxt[idx]
mn = [-1] * n
for i in range(len(valid_e)):
_, node = valid_e[i]
if mn[node] == -1:
mn[node] = i
q.append(node)
while q:
v = q.popleft()
idx = rhead[v]
while idx != -1:
t = rto[idx]
if mn[t] == -1:
mn[t] = i
q.append(t)
idx = rnxt[idx]
w.sort(reverse=True)
ans = []
for y, i in w:
if mx[i] != -1 and mn[i] != -1:
ans.append(str(mx[i] - mn[i] + 1))
else:
ans.append("0")
print('\n'.join(ans))