# python に 翻訳 https://yukicoder.me/submissions/1153828 N, M, X, K = map(int, input().split())# DSU # DSU の部分 par = [-1] * (N * 2) def leader(a): if par[a] < 0: return a else: par[a] = leader(par[a]) return par[a] def merge(a, b) : x = leader(a); y = leader(b); if x == y: return x if -par[x] < -par[y]: x, y = y, x par[x] += par[y] par[y] = x return A = list(map(int, input().split())) plus = [1<<40] * N minus = [0] * N for i in range(M): u, v = map(int, input().split()) u -= 1 v -= 1 if A[u] > A[v]: u,v = v,u if A[v] - A[u] <= X: merge(u, v + N) plus[u] = min(plus[u], A[v]) minus[v] = max(minus[v], A[u]) for i in range(N): if K == 2 or plus[i] - minus[i] <= X: merge(i, i+N) G = [[] for i in range(2*N)] rG = [[] for i in range(N)] for i in range(N): x0 = leader(i) x1 = leader(i + N) if x0 > x1: x0, x1 = x1, x0 if x0 == x1: rG[i] = [x0] G[x0].append(i) else: rG[i] = [x0, x1] G[x0].append(i) G[x1].append(i) from collections import defaultdict cnt = defaultdict(int) ans = 0 for i in range(N): if len(rG[i]) == 2: cnt[rG[i][0] * (1<<44) + rG[i][1]] += 1 for i in range(N): if len(rG[i]) == 1: ans += len(G[rG[i][0]]) - 1 else: ans += len(G[rG[i][0]]) + len(G[rG[i][1]]) - cnt[rG[i][0] * (1<<44) + rG[i][1]] - 1 print(ans)