Problem:
Score : 200 points

Problem Statement

We have a sequence p = {p_1,\ p_2,\ ...,\ p_N} which is a permutation of {1,\ 2,\ ...,\ N}.

You can perform the following operation at most once: choose integers i and j (1 \leq i < j \leq N), and swap p_i and p_j. Note that you can also choose not to perform it.

Print YES if you can sort p in ascending order in this way, and NO otherwise.

Constraints

All values in input are integers.

2 \leq N \leq 50

p is a permutation of {1,\ 2,\ ...,\ N}.

Input

Input is given from Standard Input in the following format:

N
p_1 p_2 ... p_N

Output

Print YES if you can sort p in ascending order in the way stated in the problem statement, and NO otherwise.

Sample Input 1

5
5 2 3 4 1

Sample Output 1

YES

You can sort p in ascending order by swapping p_1 and p_5.

Sample Input 2

5
2 4 3 5 1

Sample Output 2

NO

In this case, swapping any two elements does not sort p in ascending order.

Sample Input 3

7
1 2 3 4 5 6 7

Sample Output 3

YES

p is already sorted in ascending order, so no operation is needed.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.IO;

namespace contest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.SetIn(new StreamReader("input.txt"));
            solve_abc135b();
        }

        public static void solve_abc135b()
        {
            int n = Convert.ToInt32(Console.ReadLine());
            string[] test = Console.ReadLine().Split(' ');

            int[] unsorted = Array.ConvertAll(test, int.Parse);
            int[] sorted = Array.ConvertAll(test, int.Parse);;

            Array.Sort(sorted);
            int count = 0;
            for (int i = 0; i < n; i++)
            {
                if (unsorted[i] != sorted[i])
                {
                    count++;
                }
            }
            


            if (count > 2)
            {
                Console.WriteLine("NO");
            }
            else
            {
                Console.WriteLine("YES");
            }
            //TODO: check if it is possible to find within one loop
            /*
            int count = 0;
            for (int i = 0; i < n - 1; i++)
            {
                int cur = Convert.ToInt32(test[i]);
                int next = Convert.ToInt32(test[i + 1]);
                if (cur > next)
                {
                    count++;
                }
            }

            if (count > 2)
            {
                Console.WriteLine("NO");
            }
            else
            {
                Console.WriteLine("YES");
            }
            */
        }
        public static void solve_abc135a()
        {
            string[] ab = Console.ReadLine().Split(' ');

            int a = Convert.ToInt32(ab[0]);
            int b = Convert.ToInt32(ab[1]);

            int res = Math.Abs(a - b);

            if (res % 2 == 0)
            {
                Console.WriteLine(Math.Max(a, b) - res / 2);
            }
            else
            {
                Console.WriteLine("IMPOSSIBLE");
            }

        }

        public static void solve_agc35a()
        {
            int n = Convert.ToInt32(Console.ReadLine());

            string[] test = Console.ReadLine().Split(' ');

            int[] hats = Array.ConvertAll(test, int.Parse);

            Array.Sort(hats);
            string answer = "Yes";
            for (int i = 0; i < hats.Length; i++)
            {
                int prev = 0;
                int next = 0;
                if (i == 0)
                {
                    prev = hats[n - 1];
                    next = hats[i + 1];
                }
                else if (i == n - 1)
                {
                    prev = hats[i - 1];
                    next = hats[0];
                }
                else
                {
                    prev = hats[i - 1];
                    next = hats[i + 1];
                }
                if (hats[i] != (prev ^ next))
                {
                    answer = "No";
                    break;
                }
            }

            Console.WriteLine(answer);
        }

        //Скорее всего можно решить за константу.
        public static void solve_abc125_a()
        {
            string[] abt = Console.ReadLine().Split(' ');
            int a = Convert.ToInt32(abt[0]);
            int b = Convert.ToInt32(abt[1]);
            int c = Convert.ToInt32(abt[2]);

            int count = 0;
            int i = 1;
            while (i * a <= c)
            {
                count += b;
                i++;
            }

            Console.WriteLine(count);
        }

        /*
        Перый подход найти два числа такие, чтобы разность
        суммы ценностей и суммы цен была максимальной неверен. 
        Невнимательно прочитал задание. Там сказано, что можно взять
        несколько или не брать вообще. Может быть не ровно два.
        Решение:
        нужно мксимизировтаь разность ценности и цены элементов.  
        */
        public static void solve_abc125_b()
        {
            int n = Convert.ToInt32(Console.ReadLine());
            string[] values = Console.ReadLine().Split(' ');
            string[] costs  = Console.ReadLine().Split(' ');

            int max = 0;
            for (int i = 0; i < values.Length; i++)
            {
                max = Math.Max(max, max + Convert.ToInt32(values[i]) - Convert.ToInt32(costs[i]));
            }

            Console.WriteLine(max);
        }

        /*
        Первая идея найти два маскимума или маскимум и мимнимум
        и среди них искать gcd не работает. Среди остальных чисел может быть
        несколько простых чисел, которые не подойдут.
         */
        public static void solve_abc125_c()
        {
            int n = Convert.ToInt32(Console.ReadLine());
            string[] str = Console.ReadLine().Split(' ');
            int[] nums = Array.ConvertAll(str, int.Parse);

            int max = nums[0];
            for (int i = 1; i < nums.Length; i++)
            {
                int temp = gcd(max, nums[i]);
                if (max < temp)
                {
                    max = temp;
                }
                /*else if (chageElement)
                {
                    max = 
                }*/
            }

            Console.WriteLine(max);
        }

        public static int gcd(int a, int b)
        {
            if (b == 0)
            {
                return a;
            }
            return gcd(b, a % b);
        }

        public static void generate()
        {
    //         	public static void main(String[] args) {
	// 	int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	// 	int mask = 0;
	// 	int limit = 1 << array.length;
	// 	while (mask < limit) {
	// 		printPermutation(mask, array);
	// 		mask++;
	// 	}
	// }
 
	// private static void printPermutation(int mask, int[] array) {
	// 	System.out.print("(");
	// 	for (int i = 0; i < array.length; i++) {
	// 		//исли бит номер i еденичный, печатаем i-й элемент массива
	// 		if ((mask & (1 << i)) != 0) {
	// 			System.out.print(array[i] + ",");
	// 		}
	// 	}
	// 	System.out.println(")");
	// }
        }
    }
}