using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); public static void Main() { Solve(); } static void Solve() { var n = NN; var d = NList; var c = NList; var x = (long)Math.Abs(c[0]) + Math.Abs(c[1]); var emax = -1; var omax = -1; var elist = new List(); var olist = new List(); if (x == 0) { WriteLine(0); return; } foreach (var di in d) { if (x == di) { WriteLine(1); return; } if (di % 2 == 0) { emax = Math.Max(emax, di * 2); elist.Add(di); } else { omax = Math.Max(omax, di * 2); olist.Add(di); } } if (x % 2 == 0) WriteLine(x <= emax || x <= omax ? 2 : -1); else { if (elist.Count == 0 || olist.Count == 0) { WriteLine(-1); return; } elist.Sort(); olist.Sort(); foreach (var e in elist) { var opos = LowerBound(0, x - e, olist); if (opos < olist.Count && Math.Abs(e - olist[opos]) <= x) { WriteLine(2); return; } } foreach (var o in olist) { var epos = LowerBound(0, x - o, elist); if (epos < elist.Count && Math.Abs(o - elist[epos]) <= x) { WriteLine(2); return; } } WriteLine(-1); } } static int LowerBound(int left, long min, IList list) { if (list[left] >= min) return left; var ng = left; var ok = list.Count; while (ok - ng > 1) { var mid = (ng + ok) / 2; if (list[mid] < min) ng = mid; else ok = mid; } return ok; } }