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.Collections.Generic;
using System.Linq;

namespace cs
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            var input = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            
            

            SLV(N, input);
            //Console.ReadKey();
        }

        public static void SLV(int N, int[] input){

            int cnt = 0;

            for(int i = 1; i <= N; i++){
                if(input[i-1] != i){
                    cnt++;
                }
            }

            Console.WriteLine((cnt==2 || cnt ==0) ? "YES": "NO");

            return;
        }




        public static long modder(){
            return (long)Math.Pow(10,9) + 7;
        }

        public static long GCD(long n, long m){
            
            if(m % n == 0) return n;
            else return GCD(m%n, n);

        }

        public static long LCD(long n, long m){

            return m * n / GCD(n,m);
        }

        public static long lower_bound(long[] array, long input){
            var left = 0;
            var right = array.Length-1;
            var mid =0;
            while(right >= left){
                mid = left + (right - left)/2;
                if(array[mid] == input){
                    return mid;
                }
                if(array[mid] > input){
                    right = mid-1;
                }else{
                    left = mid+1;
                }
            }
    
            return right;
        }

        
        class UfTree{
            public long[] parents{get;set;}
            public long[] size{get;set;} //sizeはrootのみが最新のものを保持する
    
            public UfTree(long n){
                parents = new long[n];
                size = new long[n];
                for(long i = 0; i < n; i++){
                    parents[i] = i;
                    size[i] = 1;
                } 
            }
    
            public long getRoot(long x){
                if(parents[x] == x){
                    return x;
                }else{
                    parents[x] = getRoot(parents[x]);
                    return parents[x];
                }
            }
    
            public long unite(long x, long y){
                var rx = getRoot(x);
                var ry = getRoot(y);
                if(rx == ry){
                    return rx;
                } else{
                    var sx = getSize(rx);
                    var sy = getSize(ry);
                    if(sx > sy){
                        size[rx] = sx+sy;
                        parents[ry] = rx;
                        return rx;
                    }else{
                        size[ry] = sx+sy;
                        parents[rx] = ry;
                        return ry;
                    }
                }
                
            }
    
            public long getSize(long x){
                return size[getRoot(x)];
            }
    
            
    
            public bool isSameTree(long x, long y){
                return getRoot(x) == getRoot(y);
            }
 
        }
    }


    
}