using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
            string[] sS = System.Console.ReadLine().Trim().Split(' ');
            int iN = int.Parse(sS[0]);
            List<int> lstA = new List<int>();
            sS = System.Console.ReadLine().Trim().Split(' ');
            for (int i = 0; i < sS.Length; i++)
            {
                lstA.Add(int.Parse(sS[i]) - 1);
            }

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            // 解析
            int iOut = 0;
            if (iN > 100000)
            {
                Boolean bAllOK = true;                                              // 全部OK？
                for (int i = 0; i < lstA.Count; i++)
                {
                    if (lstA[i] != i) { bAllOK = false; break; }                    // 1個でもズレあるか
                }
                if (bAllOK) { iOut = 0; }                                           // 全部OKならここで0で抜ける
                else
                {
                    Boolean bExOne = false;                                         // 1個でも1があるか？
                    for (int i = 0; i < lstA.Count; i++)
                    {
                        if (lstA[i] == 0) { bExOne = true; break; }                 // 1ある
                    }
                    if (!bExOne) { iOut = -1; }                                     // 1つも1がないと-1で抜ける
                    else
                    {
                        int iMax = lstA.Count;
                        for (int i = 0; i < iMax; i++)
                        {
                            Boolean bExOK = false;                                  // Noと位置一致？
                            int iNo = -1;
                            for (int j = i; j < lstA.Count; j++)
                            {
                                if (lstA[j] == i) { iNo = j; bExOK = true; break; } // 一致
                            }
                            if (bExOK)
                            {
                                iNo = iNo - i - iOut;                               // 一致したのがあればその前まで破砕
                                iOut += iNo;
                            }
                            else
                            {
                                iNo = lstA.Count - i - iOut;                        // 一致したのがなければ後ろを全て破砕
                                iOut += iNo;
                                break;
                            }
                        }
                    }
                }
            }
            else
            {
                Boolean bAllOK = true;                                              // 全部OK？
                for (int i = 0; i < lstA.Count; i++)
                {
                    if (lstA[i] != i) { bAllOK = false; break; }                    // 1個でもズレあるか
                }
                if (bAllOK) { iOut = 0; }                                           // 全部OKならここで0で抜ける
                else
                {
                    Boolean bExOne = false;                                         // 1個でも1があるか？
                    for (int i = 0; i < lstA.Count; i++)
                    {
                        if (lstA[i] == 0) { bExOne = true; break; }                 // 1ある
                    }
                    if (!bExOne) { iOut = -1; }                                     // 1つも1がないと-1で抜ける
                    else
                    {
                        int iMax = lstA.Count;
                        for (int i = 0; i < iMax; i++)
                        {
                            Boolean bExOK = false;                                  // Noと位置一致？
                            int iNo = -1;
                            for (int j = i; j < lstA.Count; j++)
                            {
                                if (lstA[j] == i) { iNo = j; bExOK = true; break; } // 一致
                            }
                            if (bExOK)
                            {
                                iNo = iNo - i;                                      // 一致したのがあればその前まで破砕
                                for (int j = 1; j <= iNo; j++)
                                {
                                    lstA.RemoveAt(i);
                                    iOut += 1;
                                }
                            }
                            else
                            {
                                iNo = lstA.Count - i;                               // 一致したのがなければ後ろを全て破砕
                                for (int j = 1; j <= iNo; j++)
                                {
                                    lstA.RemoveAt(i);
                                    iOut += 1;
                                }
                                break;
                            }
                        }
                    }
                }
            }

            // 出力
            System.Console.WriteLine("{0}", iOut.ToString().Trim());

            sw.Stop();
#if DEBUG
            Console.WriteLine();
            Console.WriteLine("{0}", sw.Elapsed.ToString());
            Console.WriteLine("続行するには何かキーを押してください．．．");
            Console.ReadKey();
#endif
    }

}


Measured memory_bytes: 33884