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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<utility>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<functional>
#include<math.h>
using namespace std;
#define N (1000000000+7)
#define M (998244353)
#define INF 1e16
typedef long long ll;
typedef pair<int,int> P;

int h,w,n;
char board[1005][1005];
int x[10],y[10];
bool check(int i, int j) {
	return (i >= 1) && (i <= h) && (j >= 1) && (j <= w) && (board[i][j] == '.');
}
int d[1005][1005];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};

int main(void){
    ll n;
    cin>>n;
    vector<ll>a(n);
    for(int i=0;i<n;i++)cin>>a[i];
    if(n==1){
        cout<<1<<endl;
        return 0;
    }
    ll ans = 0;
    for(int i=0;i<n;){
        if(i==n-1){
            ans++,i++;
            continue;
        }
        if(a[i]<a[i+1]){
            while(true){
                if(i==n)break;
                if(a[i]<=a[i+1])i++;
                else {
                    i++;
                    break;
                }
            }
            ans++;
        }
        else{
            if(a[i]==a[i+1]) i++;            
            else{
                while(true){
                    if(i==n)break;
                    if(a[i]>=a[i+1])i++;
                    else {
                        i++;
                        break;
                    }
                }
                ans++;
            }
        }
        //cout<<ans<<endl;
    }
    cout<<ans<<endl;
    return 0;
}