Problem:
Score : 300 points

Problem Statement

You are given an array A of length N.
Your task is to divide it into several contiguous subarrays.
Here, all subarrays obtained must be sorted in either non-decreasing or non-increasing order.
At least how many subarrays do you need to divide A into?

Constraints

1 \leq N \leq 10^5

1 \leq A_i \leq 10^9

Each A_i is an integer.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the minimum possible number of subarrays after division of A.

Sample Input 1

6
1 2 3 2 2 1

Sample Output 1

2

One optimal solution is to divide the array into [1,2,3] and [2,2,1].

Sample Input 2

9
1 2 1 2 1 2 1 2 1

Sample Output 2

5

Sample Input 3

7
1 2 3 2 1 999999999 1000000000

Sample Output 3

3

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
class Program
{
	static void Main()
	{
	string[] input = Console.ReadLine().Split(' ');//Splitで区切り文字を指定して複数個受け取る。
	int n = int.Parse(input[0]);
	long l = int.Parse(input[1]);
  long t = int.Parse(input[2]);
  long[] answers = new long[n];
  int antCheck = 0;

  long[,] vertexes = new long[n,2];//ここに受け取る
    for(int i = 0; i < n; i++)
    {
    long[] nums = Array.ConvertAll(Console.ReadLine().Split(' '),long.Parse);//１行ごとに受け取る
    vertexes[i,0] = nums[0];
    vertexes[i,1] = nums[1];
    }

    long antNum = 0;//すれ違う回数
    long distance;//すれ違うまでの距離
    for(int i = 1; i < n; i++)
    {
      if(vertexes[i,1] == vertexes[0,1])//回転方向が異なるとき
      {
        distance = (vertexes[i,0] - vertexes[0,0] + l)%l;
        if(vertexes[0,1] == 2) distance = l - distance;
        if((l-distance)/2 >= t) antNum++;
        antNum += 2 * (t-((l-distance)/2)) / l;
        antNum %= n;
      }
    }

    long antNumPos = 0;//antNumの座標
    for(int i = 0; i < n; i++)//座標を求める
    {
      if(vertexes[i,1] == 1) answers[i] = (vertexes[i,0] + t) % l;
      else
      {
      answers[i] = (vertexes[i,0] - t) % l;
      if(answers[i] < 0) answers[i] += l;
      }
      if(i == antNum) antNumPos = answers[i];
    }
    Array.Sort(answers);

    for(int i = 0; i < n; i++)
    {
      if(antNumPos == answers[i]) antCheck = i;
    }

    for(int i = 0; i < n; i++)
    {
      long k = (antCheck - antNum + i) % n;
      if(k<0) k += n;
      Console.WriteLine(answers[k]);
    }

    
	}
}