#include using namespace std; typedef long long ll; typedef pair pii; #define pb push_back #define all(a) a.begin(), a.end() #define sz(a) ((int)a.size()) #ifdef Doludu template ostream& operator << (ostream &o, vector vec) { o << "{"; int f = 0; for (T i : vec) o << (f++ ? " " : "") << i; return o << "}"; } void bug__(int c, auto ...a) { cerr << "\e[1;" << c << "m"; (..., (cerr << a << " ")); cerr << "\e[0m" << endl; } #define bug_(c, x...) bug__(c, __LINE__, "[" + string(#x) + "]", x) #define bug(x...) bug_(32, x) #define bugv(x...) bug_(36, vector(x)) #define safe bug_(33, "safe") #else #define bug(x...) void(0) #define bugv(x...) void(0) #define safe void(0) #endif const int mod = 998244353, N = 2000006; int main() { ios::sync_with_stdio(false), cin.tie(0); int n, m, c, k; cin >> n >> m >> c >> k; vector a(n); for (int i = 0; i < n; ++i) cin >> a[i]; vector > adj(n); vector ed; int tot = 0; for (int i = 0, u, v; i < m; ++i) { cin >> u >> v, --u, --v; if (abs(a[u] - a[v]) > c) continue; adj[u].emplace_back(v, tot); adj[v].emplace_back(u, tot++); ed.emplace_back(u, v); } if (k == 2) { ll ans = 0; vector vis(n, 0); for (int i = 0; i < n; ++i) if (!vis[i]) { queue q; q.push(i), vis[i] = 1; int cnt = 0; while (!q.empty()) { int v = q.front(); q.pop(); cnt += v < n; for (auto [u, id] : adj[v]) if (!vis[u]) { q.push(u); vis[u] = 1; } } ans += 1ll * cnt * (cnt - 1); } cout << ans << "\n"; return 0; } vector > g(tot); for (int i = 0; i < n; ++i) { sort(all(adj[i]), [&](auto x, auto y) { return a[x.first] < a[y.first]; }); for (int j = 1; j < sz(adj[i]); ++j) { auto [u, eid1] = adj[i][j - 1]; auto [v, eid2] = adj[i][j]; if (abs(a[u] - a[v]) <= c) { bug(eid1, eid2); g[eid1].pb(eid2); g[eid2].pb(eid1); } } } vector cc(tot, -1), cnt, vis(n); for (int i = 0, j = 0; i < tot; ++i) if (cc[i] == -1) { queue q; q.push(i), cc[i] = j; vector vec; int now = 0; while (!q.empty()) { int v = q.front(); q.pop(); auto [x, y] = ed[v]; if (!vis[x]) now++; if (!vis[y]) now++; vis[x] = vis[y] = 1; vec.pb(v); for (int u : g[v]) { if (cc[u] == -1) { cc[u] = j, q.push(u); } } } j++; for (int id : vec) { auto [x, y] = ed[id]; vis[x] = vis[y] = 0; } cnt.pb(now); } ll ans = 0; for (int i = 0; i < n; ++i) { int res = 0; set S; for (auto [v, id] : adj[i]) { S.insert(cc[id]); } bug(i); bugv(all(S)); for (int id : S) { res += cnt[id] - 1; } bug(i, res); ans += res; } cout << ans << "\n"; }