using System; using System.Collections.Generic; class Program { static void Main() { var inp = Console.ReadLine().Split(); int N = int.Parse(inp[0]); int S = int.Parse(inp[1]) - 1; int T = int.Parse(inp[2]) - 1; long K = long.Parse(inp[3]); var A = Array.ConvertAll(Console.ReadLine().Split(), long.Parse); // (値, index)をまとめてソート var items = new List<(long val, int idx)>(); for (int i = 0; i < N; i++) items.Add((A[i], i)); items.Sort((x, y) => x.val.CompareTo(y.val)); // 未訪問集合を値昇順に保持(実体は List+pointer で十分) var alive = new LinkedList<(long val, int idx)>(items); var visited = new bool[N]; var dist = new int[N]; var q = new Queue(); visited[S] = true; q.Enqueue(S); // S の項目を alive から除去 var node = alive.First; while (node != null) { if (node.Value.idx == S) { var tmp = node; node = node.Next; alive.Remove(tmp); break; } node = node.Next; } while (q.Count > 0) { int u = q.Dequeue(); if (u == T) { Console.WriteLine(dist[u]); return; } long limit = K - A[u]; // alive の先頭から limit 以下のものを全て取り出す var cur = alive.First; while (cur != null && cur.Value.val <= limit) { int v = cur.Value.idx; if (!visited[v]) { visited[v] = true; dist[v] = dist[u] + 1; q.Enqueue(v); } var tmp = cur; cur = cur.Next; alive.Remove(tmp); } } Console.WriteLine(-1); } }