Gena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A sequence is an almost arithmetical progression, if its elements can be represented as:

  * a1 = p, where p is some integer; 
  * ai = ai - 1 + ( - 1)i + 1·q (i > 1), where q is some integer. 



Right now Gena has a piece of paper with sequence b, consisting of n integers. Help Gena, find there the longest subsequence of integers that is an almost arithmetical progression.

Sequence s1, s2, ..., sk is a subsequence of sequence b1, b2, ..., bn, if there is such increasing sequence of indexes i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ n), that bij = sj. In other words, sequence s can be obtained from b by crossing out some elements.

Input

The first line contains integer n (1 ≤ n ≤ 4000). The next line contains n integers b1, b2, ..., bn (1 ≤ bi ≤ 106).

Output

Print a single integer — the length of the required longest subsequence.

Examples

Input

2
3 5


Output

2


Input

4
10 20 10 30


Output

3

Note

In the first test the sequence actually is the suitable subsequence. 

In the second test the following subsequence fits: 10, 20, 10.
import java.io.*;
import java.util.*;
public final class round_156_c
{
    static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static FastScanner sc=new FastScanner(br);
    static PrintWriter out=new PrintWriter(System.out);
	static ArrayList<Integer>[] al;
	static int[] a,b;
	static int[][] dp;
	static int max=2;
	
	static int search(int idx,int next)
	{
		int low=0,high=al[idx].size()-1;
		while(low<high)
		{
			int mid=(low+high)>>1;
			if(al[idx].get(mid)>next)
			{
				high=mid;
			}
			else
			{
				low=mid+1;
			}
		}
		return ((al[idx].get(low)>next && al[idx].get(low)!=Integer.MAX_VALUE)?al[idx].get(low):-1);
	}
	
	static int solve(int i,int j)
	{
		if(dp[i][j]!=-1)
		{
			return dp[i][j];
		}
		else
		{
			int pos=search(a[i],j),ans=0;
			if(pos>j)
			{
				ans=1+solve(j,pos);
			}
			dp[i][j]=ans;
			return dp[i][j];
		}
	}
	
	@SuppressWarnings("unchecked")
	static void init(int maxn)
	{
		al=new ArrayList[maxn];
		for(int i=0;i<maxn;i++)
		{
			al[i]=new ArrayList<Integer>();
		}
	}

	public static void main(String args[]) throws Exception
	{
		int n=sc.nextInt();init(n);
		a=new int[n];dp=new int[n][n];b=new int[n];
		for(int i=0;i<n;i++)
		{
			a[i]=sc.nextInt();
			b[i]=a[i];
		}
		if(n<=2)
		{
			out.println(n);
		}
		else
		{
			Arrays.sort(b);
			for(int i=0;i<n;i++)
			{
				a[i]=Arrays.binarySearch(b,a[i]);
				al[a[i]].add(i);
			}
			for(int i=0;i<n;i++)
			{
				al[i].add(Integer.MAX_VALUE);
			}
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					dp[i][j]=-1;
				}
			}
			for(int i=0;i<n;i++)
			{
				for(int j=i+1;j<n;j++)
				{
					max=Math.max(max,2+solve(i,j));
				}
			}
			out.println(max);
		}
		out.close();
	}
}
class FastScanner
{
    BufferedReader in;
    StringTokenizer st;

    public FastScanner(BufferedReader in) {
        this.in = in;
    }
	
    public String nextToken() throws Exception {
        while (st == null || !st.hasMoreTokens()) {
            st = new StringTokenizer(in.readLine());
        }
        return st.nextToken();
    }
	
	public String next() throws Exception {
		return nextToken().toString();
	}
	
    public int nextInt() throws Exception {
        return Integer.parseInt(nextToken());
    }

    public long nextLong() throws Exception {
        return Long.parseLong(nextToken());
    }

    public double nextDouble() throws Exception {
        return Double.parseDouble(nextToken());
    }
}