DZY has a sequence a, consisting of n integers.

We'll call a sequence ai, ai + 1, ..., aj (1 ≤ i ≤ j ≤ n) a subsegment of the sequence a. The value (j - i + 1) denotes the length of the subsegment.

Your task is to find the longest subsegment of a, such that it is possible to change at most one number (change one number to any integer you want) from the subsegment to make the subsegment strictly increasing.

You only need to output the length of the subsegment you find.

Input

The first line contains integer n (1 ≤ n ≤ 105). The next line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109).

Output

In a single line print the answer to the problem — the maximum length of the required subsegment.

Examples

Input

6
7 2 3 1 5 6


Output

5

Note

You can choose subsegment a2, a3, a4, a5, a6 and change its 3rd element (that is a4) to 4.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 *
 *
 * 10 5 8 1 10 3 6 2 9 7 4 4 2 6 3 1 9 10 5 8 7
 *
 * @author pttrung
 */
public class C {

    //   public static long x, y, gcd;
    public static int Mod = 1000000007;
    public static PrintWriter out;

    public static void main(String[] args) throws FileNotFoundException {
        Scanner in = new Scanner();
        out = new PrintWriter(System.out);
        //   System.out.println(Integer.MAX_VALUE);
        //PrintWriter out = new PrintWriter(new FileOutputStream(new File("output.txt")));
        int n = in.nextInt();
        int[] data = new int[n];
        int start = 0;
        ArrayList<Gap> list = new ArrayList();
        int result = 0;
        for (int i = 0; i < n; i++) {
            data[i] = in.nextInt();
            if (i > 0) {
                if (data[i] <= data[i - 1]) {
                    list.add(new Gap(start, i - 1));
                    result = Math.max(result, i - start + 1);
                    start = i;
                }
            }
        }

        list.add(new Gap(start, n - 1));
        //System.out.println(list);
        if (start > 0) {
            result = Math.max(result, n - start + 1);
        } else {
            result = Math.max(result, n - start);
        }
        for (int i = 1; i < list.size(); i++) {
            Gap a = list.get(i - 1);
            Gap b = list.get(i);
            if (a.end + 1 == b.start) {
                //System.out.println(a + " " + b);
                if (b.start != b.end) {
                    int c = data[a.end];
                    int d = data[b.start + 1];
                    if (c + 2 <= d) {
                        result = Math.max(result, b.end - a.start + 1);
                    }
                }
                if (a.start != a.end) {
                    int c = data[a.end - 1];
                    int d = data[b.start];
                    if (c + 2 <= d) {
                        result = Math.max(result, b.end - a.start + 1);
                    }
                }
            }
        }
        for (int i = 2; i < list.size(); i++) {
            Gap a = list.get(i - 2);
            Gap b = list.get(i);
            if (a.end + 2 == b.start) {
                int c = data[a.end];
                int d = data[b.start];
                if (c + 2 <= d) {
                    result = Math.max(result, b.end - a.start + 1);
                }
            }
        }
        out.println(result);
        out.close();
    }

    public static class Gap {

        int start, end;

        public Gap(int start, int end) {
            this.start = start;
            this.end = end;
        }

        public String toString() {
            return "Gap " + start + " " + end;
        }
    }

    public static long pow(long a, long b) {
        if (b == 0) {
            return 1;
        }
        if (b == 1) {
            return a;
        }
        long val = pow(a, b / 2);
        if (b % 2 == 0) {
            return val * val;
        } else {
            return val * val * a;
        }
    }

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


    }

    public static class Point implements Comparable<Point> {

        int x, y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public int compareTo(Point o) {
            if (x != o.x) {
                return x - o.x;
            } else {
                return y - o.y;
            }
        }
    }
//    public static void extendEuclid(long a, long b) {
//        if (b == 0) {
//            x = 1;
//            y = 0;
//            gcd = a;
//            return;
//        }
//        extendEuclid(b, a % b);
//        long x1 = y;
//        long y1 = x - (a / b) * y;
//        x = x1;
//        y = y1;
//
//    }

    public static class FT {

        long[] data;

        FT(int n) {
            data = new long[n];
        }

        public void update(int index, long value) {
            while (index < data.length) {
                data[index] += value;
                index += (index & (-index));
            }
        }

        public long get(int index) {
            long result = 0;
            while (index > 0) {
                result += data[index];
                index -= (index & (-index));
            }
            return result;

        }
    }

    static class Scanner {

        BufferedReader br;
        StringTokenizer st;

        public Scanner() throws FileNotFoundException {
            // System.setOut(new PrintStream(new BufferedOutputStream(System.out), true));
            br = new BufferedReader(new InputStreamReader(System.in));
            //br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("input.txt"))));
        }

        public String next() {

            while (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (Exception e) {
                    throw new RuntimeException();
                }
            }
            return st.nextToken();
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public double nextDouble() {
            return Double.parseDouble(next());
        }

        public String nextLine() {
            st = null;
            try {
                return br.readLine();
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }

        public boolean endLine() {
            try {
                String next = br.readLine();
                while (next != null && next.trim().isEmpty()) {
                    next = br.readLine();
                }
                if (next == null) {
                    return true;
                }
                st = new StringTokenizer(next);
                return st.hasMoreTokens();
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
    }
}
