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.*; 
import java.lang.reflect.Array; 
import java.math.BigDecimal;
import java.math.BigInteger; 
import java.util.*; 
import java.util.Map.Entry;

import static java.lang.Math.*; 
   
public class solver implements Runnable { 
        final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null; 
        BufferedReader in; 
        PrintWriter out; 
        StringTokenizer tok = new StringTokenizer(""); 
          
        String readString() throws IOException{ 
                while(!tok.hasMoreTokens()){ 
                        try{ 
                                tok = new StringTokenizer(in.readLine()); 
                        }catch (Exception e){ 
                                return null; 
                        } 
                } 
                return tok.nextToken(); 
        } 
        String readString(String delim) throws IOException{ 
            while(!tok.hasMoreTokens()){ 
                    try{ 
                         tok = new StringTokenizer(in.readLine()); 
                    }catch (Exception e){ 
                            return null; 
                    } 
            } 
            return tok.nextToken(delim); 
    } 
         
        int readInt() throws IOException{ 
                return Integer.parseInt(readString()); 
        }   
        long readLong() throws IOException{ 
                return Long.parseLong(readString()); 
        }       
        double readDouble() throws IOException{ 
                return Double.parseDouble(readString()); 
        }  
        char readChar() throws IOException { 
            char val = 0; 
            do{ 
                val = (char) in.read(); 
            }while(val == '\n' || val == '\r'); 
            return val; 
        } 
        char readChar(String skipChars)throws IOException{ 
            char val = 0; 
            boolean ret; 
            do{ 
                val = (char) in.read(); 
                ret = false; 
                for (int i = skipChars.length()-1; i >= 0; i--){ 
                    if (skipChars.charAt(i) == val){ 
                        ret = true; 
                        break; 
                    } 
                } 
            }while(ret); 
            return val; 
        }
//----------------------------------
        int gcd(int x, int y){
            while (y != 0) {
                int temp = x%y; x = y; y = temp;
            }
            return x;
        }
//----------------------------------        
          
        public class Pair<T1,T2> { 
            public T1 x1; 
            public T2 x2; 
            public Pair(){}; 
            public Pair(T1 x1, T2 x2){ 
                this.x1 = x1; 
                this.x2 = x2; 
            } 
            public String toString(){ 
                return x1 + ":" + x2; 
            } 
        } 
        public class Point implements Comparable<Point>{ 
            public int x1, x2; 
            public Point(){} 
            public Point(int a, int b){x1 = a;x2=b;} 
            public int compareTo(Point o) {              
                return (x1-o.x1);  
                // (x1-o.x1) - increase; -(x1-o.x1) - decrease 
            } 
            public String toString(){ 
                return x1 + ":" + x2; 
            } 
            public boolean equals(Object o){
                Point p = (Point)o;
                return x1 ==p.x2;
            }
        } 
        public class Three implements Comparable<Three>{ 
            public int x1, x2, x3; 
            public Three(){} 
            public Three(int a, int b, int c){x1 = a;x2=b;x3=c;} 
            public int compareTo(Three o) {
                if(x1 == o.x1 && x2 == o.x2) return x3-o.x3;
                if(x1 == o.x1) return x2-o.x2;
                return (x1-o.x1);  
                // (x1-o.x1) - increase; -(x1-o.x1) - decrease 
            } 
            public String toString(){ 
                return x1 + ":" + x2 + ":" + x3; 
            } 
        } 
//----------------------------------------     
        
                
        
        
        public void solve() throws IOException {
            
            int n = readInt();
            int[] arr =  new int[n];
            int[] l = new int[n];
            int[] r = new int[n];
            
            int mm = (int)1e9;
            l[0] = 1;
            for (int i = 0 ; i < n; i++){
                arr[i] = readInt();
                if (i > 0 && arr[i] > arr[i-1]){
                    l[i] = l[i-1]+1;
                }else{
                    l[i] = 1;
                }
            }
            
            r[n-1] = 1;
            for (int i = n-2 ; i >=0; i--){
                if (arr[i] < arr[i+1]){
                    r[i] = r[i+1]+1;
                }else{
                    r[i] = 1;
                }
            }
                        
            int max = 1;
            
            for (int i = 0; i < n; i++){                
                if (i > 0 && i < n -1 && arr[i-1] + 1 < arr[i+1]){
                    max = max(max, l[i-1] + 1 + r[i+1]);
                }
                if (i > 0){
                    max = max(max, l[i-1] +1);
                }
                if (i < n-1) {
                    max = max(max, 1 + r[i+1]);
                }
            }           
            
            out.print(max);
        }
          
//---------------------------------------- 
        public static void main(String[] args){ 
                new Thread(null, new solver(), "", 256 * (1L << 20)).start(); 
        } 
         
        public void run(){ 
                try{ 
                        timeBegin = System.currentTimeMillis(); 
                        try{ 
                            if (ONLINE_JUDGE){ 
                                in = new BufferedReader(new InputStreamReader(System.in)); 
                                out = new PrintWriter(System.out); 
                            }  
                            else { 
                                in = new BufferedReader(new FileReader("input.txt")); 
                                out = new PrintWriter("output.txt"); 
                            } 
                        }catch(Throwable e){
                            in = new BufferedReader(new InputStreamReader(System.in)); 
                            out = new PrintWriter(System.out); 
                        }
                          
                        solve(); 
                        out.close(); 
                          
                        timeEnd = System.currentTimeMillis(); 
                        System.err.println("Time = " + (timeEnd - timeBegin)); 
                }catch (Exception e){ 
                        e.printStackTrace(System.err); 
                        System.exit(-1); 
                } 
        } 
         
        long timeBegin, timeEnd; 
   
          
//----------        
        void update(int[] doo, int v, int i, int val, int ll, int rr){ 
            if (ll == rr){ 
                doo[v] = val; 
            }else{ 
                int med = ll + ((rr-ll)>>1); 
                  
                if (i <= med){ 
                    update(doo, v<<1, i, val, ll, med); 
                }else{ 
                    update(doo, (v<<1)+1, i, val, med+1, rr); 
                } 
                doo[v] = min(doo[v<<1],doo[(v<<1)+1]); 
            } 
        } 
        int get(int[] doo, int v, int l, int r, int ll, int rr){ 
            if (l > r){ 
                return Integer.MAX_VALUE; 
            } 
            if (ll == l && r == rr){ 
                return doo[v]; 
            } 
            int med = ll + ((rr-ll)>>1);
            int v2 = v<<1;
            return min(get(doo, v2, l, min(r, med), ll, med),  
                    get(doo, v2+1, max(l, med+1), r, med+1, rr)); 
        } 
 //----------------------------------------

        int BinSearch(int[] a, int x, boolean increase){

            int first = 0;
            int last = a.length;
            
            if (increase){
                while (first <= last) {
                    int mid = first + ((last - first) >> 1);                
                    if (x <= a[mid])
                        last = mid;
                    else
                        first = mid + 1;
                }
                return last;
            }else{
                while (first <= last) {
                    int mid = first + ((last - first) >> 1);                
                    if (x > a[mid])
                        last = mid;
                    else
                        first = mid + 1;
                }
                return first;
            }
        }
        
        
//-----------------------------------------
}