You have an array a of length n. For every positive integer x you are going to perform the following operation during the x-th second:

  * Select some distinct indices i_{1}, i_{2}, …, i_{k} which are between 1 and n inclusive, and add 2^{x-1} to each corresponding position of a. Formally, a_{i_{j}} := a_{i_{j}} + 2^{x-1} for j = 1, 2, …, k. Note that you are allowed to not select any indices at all.



You have to make a nondecreasing as fast as possible. Find the smallest number T such that you can make the array nondecreasing after at most T seconds.

Array a is nondecreasing if and only if a_{1} ≤ a_{2} ≤ … ≤ a_{n}.

You have to answer t independent test cases.

Input

The first line contains a single integer t (1 ≤ t ≤ 10^{4}) — the number of test cases.

The first line of each test case contains single integer n (1 ≤ n ≤ 10^{5}) — the length of array a. It is guaranteed that the sum of values of n over all test cases in the input does not exceed 10^{5}.

The second line of each test case contains n integers a_{1}, a_{2}, …, a_{n} (-10^{9} ≤ a_{i} ≤ 10^{9}).

Output

For each test case, print the minimum number of seconds in which you can make a nondecreasing.

Example

Input


3
4
1 7 6 5
5
1 2 3 4 5
2
0 -4


Output


2
0
3

Note

In the first test case, if you select indices 3, 4 at the 1-st second and 4 at the 2-nd second, then a will become [1, 7, 7, 8]. There are some other possible ways to make a nondecreasing in 2 seconds, but you can't do it faster.

In the second test case, a is already nondecreasing, so answer is 0.

In the third test case, if you do nothing at first 2 seconds and select index 2 at the 3-rd second, a will become [0, 0].
import java.util.*;
 
import java.io.*;


 
 public class Main {
 
    public static void main(String[] args) {
         
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader inp = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        Solver solver = new Solver();
        solver.solve(inp, out);
        out.close();
 
    }
 
 
 
 
 
    static class Solver {
 
        class pair implements Comparable<pair>{
 
            int i;
            int cnt;
            public pair(int i,int cnt)
            {
                this.i=i;
                this.cnt=cnt;
            }
 
            public int compareTo(pair p)
            {
                return Long.compare(this.i,p.i);
            }
 
        }
 
        class Node implements Comparable < Node > {
            int i;
            int cnt;
 
            Node(int i, int cnt) {
                this.i = i;
                this.cnt = cnt;
            }
 
            public int compareTo(Node n) {
                if (this.cnt == n.cnt) {
                    return Integer.compare(this.i, n.i);
                }
                return Integer.compare(this.cnt, n.cnt);
            }
        }
 
        public boolean done(int[] sp, int[] par) {
            int root;
 
            root = findSet(sp[0], par);
 
            for (int i = 1; i < sp.length; i++) {
                if (root != findSet(sp[i], par))
                    return false;
            }
            return true;
        }
        public int findSet(int i, int[] par) {
            int x = i;
            boolean flag = false;
            while (par[i] >= 0) {
                flag = true;
                i = par[i];
            }
            if (flag)
                par[x] = i;
            return i;
        }
 
        public void unionSet(int i, int j, int[] par) {
            int x = findSet(i, par);
            int y = findSet(j, par);
            if (x < y) {
                par[y] = x;
            } else {
                par[x] = y;
            }
        }
 
        public long pow(long a, long b, long MOD) {
            if (b == 0) {
                return 1;
            }
            if (b == 1) {
                return a;
            }
            long val = pow(a, b / 2, MOD);
            if (b % 2 == 0) {
                return val * val % MOD;
            } else {
                return val * (val * a % MOD) % MOD;
 
            }
 
        }
 
        public boolean isPrime(int n)
        {
            for(int i=2;i<n;i++)
            {
                if(n%i==0)
                {
                    return false;
                }
            }
            return true;
        }
 
 
        public void minPrimeFactor(int n, int[] s) {
            boolean prime[] = new boolean[n + 1];
            Arrays.fill(prime, true);
            s[1] = 1;
            s[2] = 2;
            for (int i = 4; i <= n; i += 2) {
                prime[i] = false;
                s[i] = 2;
            }
 
            for (int i = 3; i <= n; i += 2) {
                if (prime[i]) {
                    s[i] = i;
                    for (int j = 2 * i; j <= n; j += i) {
                        prime[j] = false;
                        s[j] = i;
                    }
                }
            }
 
        }
 
 
        public void findAllPrime(int n, ArrayList < Node > al, int s[]) {
            int curr = s[n];
            int cnt = 1;
            while (n > 1) {
                n /= s[n];
                if (curr == s[n]) {
                    cnt++;
                    continue;
 
                }
                Node n1 = new Node(curr, cnt);
                al.add(n1);
 
                curr = s[n];
                cnt = 1;
            }
        }
 
 
 
        public int binarySearch(int n, int k) {
            int left = 1;
            int right = 100000000 + 5;
            int ans = 0;
            while (left <= right) {
                int mid = (left + right) / 2;
                if (n / mid >= k) {
                    left = mid + 1;
                    ans = mid;
                } else {
                    right = mid - 1;
                }
            }
 
            return ans;
        }
        public boolean checkPallindrom(String s) {
            char ch[] = s.toCharArray();
 
            for (int i = 0; i < s.length() / 2; i++) {
                if (ch[i] != ch[s.length() - 1 - i])
                    return false;
            }
            return true;
        }

        public boolean pallindrom(String s1, String s2)
        {
            char ch[] = s1.toCharArray();
            char ch1[] = s2.toCharArray();

            for(int i=0;i<s1.length();i++)
            {
                if(ch[i]!=ch1[s1.length()-1-i])
                {
                    return false;
                }
            }

            return true;
        }
 
 
 
 
        public void remove(ArrayList < Integer > [] al, int x) {
            for (int i = 0; i < al.length; i++) {
                for (int j = 0; j < al[i].size(); j++) {
 
                    if (al[i].get(j) == x)
                        al[i].remove(j);
 
                }
            }
        }
 
        public long gcd(long a, long b) {
            if (a == 0)
                return b;
            return gcd(b % a, a);
        }
 
 
        public void printDivisors(long n, ArrayList < Long > al) {
            // Note that this loop runs till square root 
            for (long i = 1; i*i <= (n); i++) {
                if (n % i == 0) {
                    // If divisors are equal, print only one 
                    if (n / i == i) {
                        al.add(i);
                    } else // Otherwise print both 
                    {
                        al.add(i);
                        al.add(n / i);
                    }
 
                }
            }
        }
 
        public static long constructSegment(long seg[], long arr[], int low, int high, int pos) {
            if (low == high) {
                seg[pos] = arr[low];
                return seg[pos];
            }
            int mid = (low + high) / 2;
            long t1 = constructSegment(seg, arr, low, mid, (2 * pos) + 1);
            long t2 = constructSegment(seg, arr, mid + 1, high, (2 * pos) + 2);
            seg[pos] = t1 + t2;
            return seg[pos];
 
        }
        public static long querySegment(long seg[], int low, int high, int qlow, int qhigh, int pos) {
 
            if (qlow <= low && qhigh >= high) {
                return seg[pos];
            } else if (qlow > high || qhigh < low) {
                return 0;
            } else {
                long ans = 0;
                int mid = (low + high) / 2;
                ans += querySegment(seg, low, mid, qlow, qhigh, (2 * pos) + 1);
                ans += querySegment(seg, mid + 1, high, qlow, qhigh, (2 * pos) + 2);
                return ans;
            }
 
        }
        public static int lcs(char[] X, char[] Y, int m, int n) {
            if (m == 0 || n == 0)
                return 0;
            if (X[m - 1] == Y[n - 1])
                return 1 + lcs(X, Y, m - 1, n - 1);
            else
                return Integer.max(lcs(X, Y, m, n - 1), lcs(X, Y, m - 1, n));
        }
 
        public static long recursion(long start, long end, long cnt[], int a, int b) {
 
            long min = 0;
            long count = 0;
            int ans1 = -1;
            int ans2 = -1;
            int l = 0;
            int r = cnt.length - 1;
            while (l <= r) {
                int mid = (l + r) / 2;
                if (cnt[mid] >= start) {
                    ans1 = mid;
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            }
 
            l = 0;
            r = cnt.length - 1;
            while (l <= r) {
                int mid = (l + r) / 2;
                if (cnt[mid] <= end) {
                    ans2 = mid;
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
 
            if (ans1 == -1 || ans2 == -1 || ans2 < ans1) {
                // System.out.println("min1 "+min);
                min = a;
                return a;
 
            } else {
                min = b * (end - start + 1) * (ans2 - ans1 + 1);
            }
            if (start == end) {
                // System.out.println("min "+min);
                return min;
            }
            long mid = (end + start) / 2;
            min = Long.min(min, recursion(start, mid, cnt, a, b) + recursion(mid + 1, end, cnt, a, b));
            // System.out.println("min "+min);
            return min;
        }
 
 
        public int lowerBound(ArrayList<Long> al,long ele)
        {
            int l =0;
            int r =al.size()-1;
            int ans=-1;
            while(l<=r)
            {
                int mid = (l+r)/2;
                if(al.get(mid)<=ele)
                {
                    ans=mid;
                    l=mid+1;
                }
                else
                {
                    r=mid-1;
                }


            }
            return ans;
        }
        
        public int lowerBound(long arr[],long ele)
        {
            int l =0;
            int r =arr.length-1;
            int ans=-1;
            while(l<=r)
            {
                int mid = (l+r)/2;
                if(arr[mid]<=ele)
                {
                    ans=mid;
                    l=mid+1;
                }
                else
                {
                    r=mid-1;
                }


            }
            return ans;
        }
 
        public int dfs_util(ArrayList < Integer > [] al, boolean vis[], int x, int[] s, int lvl[]) {
 
            vis[x] = true;
            int cnt = 1;
            for (int i = 0; i < al[x].size(); i++) {
 
                if (!vis[al[x].get(i)]) {
                    lvl[al[x].get(i)] = lvl[x] + 1;
                    cnt += dfs_util(al, vis, al[x].get(i), s, lvl);
 
 
                }
 
 
            }
            s[x] = cnt;
            return s[x];
        }
 
        public void dfs(ArrayList[] al, int[] s, int[] lvl) {
 
            boolean vis[] = new boolean[al.length];
            for (int i = 0; i < al.length; i++) {
                if (!vis[i]) {
                    lvl[i] = 1;
                    dfs_util(al, vis, i, s, lvl);
                }
            }
        }
 

        public void permute(String s,int l, int r,ArrayList<String> al)
        {
            if(l==r)
            {
                al.add(s);
                
            }
            for(int i=l;i<=r;i++)
            {
                String str=swap(s,l,i);
                permute(str, l+1, r, al);
                
            }
        
        }

        public String swap(String s, int l, int r)
        {
            char ch[] = s.toCharArray();
            char tem = ch[l];
            ch[l]=ch[r];
            ch[r]=tem;
            return String.valueOf(ch);
        }
        

        public int[] computeLps(String s)
        {
            int ans[] =new int[s.length()];
            char ch[] = s.toCharArray();
            int n = s.length();
            int i=1;
            int len=0;
            ans[0]=0;
            while(i<n)
            {
                if(ch[i]==ch[len])
                {
                    len++;
                    ans[i]=len;
                    i++;
                }
                else
                {
                    if(len!=0)
                    {
                        len=ans[len-1];
                    }
                    else
                    {
                        ans[i]=len;
                        i++;
                    }
                }
            }
 
            return ans;
 
        }

        public int longestPrefixSuffix(String s)  
        { 
            int n = s.length(); 
        
            if(n < 2) { 
                return 0; 
            } 
    
            int len = 0; 
            int i = n/2; 
            while(i < n) { 
                if(s.charAt(i) == s.charAt(len)) { 
                ++len; 
                ++i; 
            }  
            else 
            { 
            if(len == 0) { 
                ++i; 
            }  
            else 
            {  
                
                --len; 
            } 
            } 
    } 
        
    return len; 
          
} 

        public boolean convertFromBaseToBase(long num, int fromBase, int toBase,HashSet<Integer> hs) {
            StringBuilder s=new StringBuilder();
            boolean f=true;
            int cnt=0;
            while(num>0)
            {
               long tem = num%toBase;
               if(tem==1)
               {
                 if(hs.contains(cnt))
                 {
                     f=false;
                     break;
                 }
                 else
                 {
                     hs.add(cnt);
                 }
               }
               else if(tem==0)
               {

               }
               else
               {
                f=false;
                break;
               }
               num/=toBase;
               cnt++;

            }


            return f;
            
        }

        private boolean possible(long arr[],long d,long k)
        {
            long tem=0;
            for(int i=0;i<arr.length-1;i++)
            {
                tem+=(arr[i+1]-arr[i])/(d);

                if((arr[i+1]-arr[i])%d==0)
                    tem--;
                
            }
            if(tem<=k)
            {
                return true;
            }
            else
                return false;
            
        }

        public void bfsUtil(ArrayList<Integer> a[],int out[])
        {
            boolean vis[] = new boolean[a.length];
            for(int i=0;i<a.length;i++)
            {
                if(!vis[i])
                {
                    bipartie(a, vis,out,i);
                }
            }
        }


        public int[] bipartie(ArrayList<Integer> arr[],boolean vis[],int color[],int e)
        {
          
          
            Queue<Integer> q = new LinkedList<>();
            color[e]=1;
            q.add(e);
            while(!q.isEmpty())
            {
                int x = q.remove();
                if(vis[x])
                {
                    continue;
                }
                vis[x]=true;
                for(int i=0;i<arr[x].size();i++)
                {
                    if(!vis[arr[x].get(i)])
                    {
                        
                    }
                    else
                    {
                        if(color[arr[x].get(i)]==color[x])
                        {
                            color[x]=2;
                        }
                    }
                }

                for(int i=0;i<arr[x].size();i++)
                {
                    if(!vis[arr[x].get(i)])
                    {
                        if(color[x]==2)
                        {
                            color[arr[x].get(i)]=0;
                            
                        }
                        else
                        {
                            color[arr[x].get(i)]=1-color[x];
                            
                        }
                        q.add(arr[x].get(i));
                    }
                    
                }
            }
            return color;
        }

        
        
 
       
 
        private void solve(InputReader inp, PrintWriter out1) {
            
          int t = inp.nextInt();
          for(int k=0;k<t;k++)
          {
              int n = inp.nextInt();
              long arr[] = new long[n];
              for(int i=0;i<n;i++)
              {
                  arr[i] = inp.nextLong();

              }
              long max=arr[0];
              long diff_max=0;
              for(int i=1;i<n;i++)
              {
                  max = Math.max(arr[i],max);
                  if(max>arr[i])
                  {
                      long tem = max-arr[i];
                      diff_max = Math.max(diff_max,tem);

                  }
              }
            //   System.out.println("diff "+diff_max);
              double d = Math.log((double)(diff_max+1))/(Math.log(2));
              
              System.out.println((long)Math.ceil(d));
          }
          
            
        }
    }

 
 
    static class InputReader {
        BufferedReader reader;
        StringTokenizer tokenizer;
 
        InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }
 
        String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }
 
        public int nextInt() {
            return Integer.parseInt(next());
        }
 
        public long nextLong() {
            return Long.parseLong(next());
        }
    }
}
class ele implements Comparable<ele>{
    int a;
    int n;
    public ele(int a,int n)
    {
        this.a=a;
        this.n=n;
    }
    @Override
    public int compareTo(ele e)
    {
        if(e.n==this.n)
            return -1;
        
        return -Integer.compare(this.n,e.n);
    }
}