You play a computer game. In this game, you lead a party of m heroes, and you have to clear a dungeon with n monsters. Each monster is characterized by its power a_i. Each hero is characterized by his power p_i and endurance s_i.

The heroes clear the dungeon day by day. In the beginning of each day, you choose a hero (exactly one) who is going to enter the dungeon this day.

When the hero enters the dungeon, he is challenged by the first monster which was not defeated during the previous days (so, if the heroes have already defeated k monsters, the hero fights with the monster k + 1). When the hero fights the monster, there are two possible outcomes:

  * if the monster's power is strictly greater than the hero's power, the hero retreats from the dungeon. The current day ends; 
  * otherwise, the monster is defeated. 



After defeating a monster, the hero either continues fighting with the next monster or leaves the dungeon. He leaves the dungeon either if he has already defeated the number of monsters equal to his endurance during this day (so, the i-th hero cannot defeat more than s_i monsters during each day), or if all monsters are defeated — otherwise, he fights with the next monster. When the hero leaves the dungeon, the current day ends.

Your goal is to defeat the last monster. What is the minimum number of days that you need to achieve your goal? Each day you have to use exactly one hero; it is possible that some heroes don't fight the monsters at all. Each hero can be used arbitrary number of times.

Input

The first line contains one integer t (1 ≤ t ≤ 10^5) — the number of test cases. Then the test cases follow.

The first line of each test case contains one integer n (1 ≤ n ≤ 2 ⋅ 10^5) — the number of monsters in the dungeon.

The second line contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 10^9), where a_i is the power of the i-th monster.

The third line contains one integer m (1 ≤ m ≤ 2 ⋅ 10^5) — the number of heroes in your party.

Then m lines follow, each describing a hero. Each line contains two integers p_i and s_i (1 ≤ p_i ≤ 10^9, 1 ≤ s_i ≤ n) — the power and the endurance of the i-th hero.

It is guaranteed that the sum of n + m over all test cases does not exceed 2 ⋅ 10^5.

Output

For each test case print one integer — the minimum number of days you have to spend to defeat all of the monsters (or -1 if it is impossible).

Example

Input


2
6
2 3 11 14 1 8
2
3 2
100 1
5
3 5 100 2 3
2
30 5
90 1


Output


5
-1
import java.io.*;
import java.util.*;


import java.text.*;
import java.lang.*;
import java.math.*;
 
public class Myclass{
    static ArrayList[] a=new ArrayList[200];
 
     public void solve () throws FileNotFoundException  {
    	 InputReader in = new InputReader(System.in);
         PrintWriter pw = new PrintWriter(System.out);
       int t = in.nextInt();
      outer : while(t -- >0) {
    	   int n = in.nextInt();
    	   long a[] = new long [n];
    	   for(int i = 0 ;i < n ;i++)
    		   a[i] = in.nextLong();
    	   Segment s = new Segment(n ,a);
    	   s.build(0, 0, n-1);
    	   int m = in.nextInt();
    	   pair p[] = new  pair [m];
    	   for(int i = 0 ; i < m ; i++) {
    		  p[i] = new  pair(in.nextLong(),in.nextInt());
    	   }
    	   Arrays.sort(p,new Comparator<pair>() {
    		   public int compare(pair p1,pair p2) {
    			   if(p1.x<p2.x) return -1;
    			   if(p1.x>p2.x) return 1;
    			   if(p1.y<p2.y) return -1;
    			   if(p1.y>p2.y) return 1;
    			   return 0;
    		   }
    	   });
    	   long pre[] = new long [m];
    	   pre[m - 1] = p[m - 1].y;
    	   for(int i = m - 2 ; i >= 0 ; i--) {
    		   pre[i] = Math.max(pre[i + 1], p[i].y);
    	   }
    	   long dp[] = new long [n];
    	   for(int i = 0 ; i < n ; i ++) {
    		   int start = 0;
    		   int end = i;
    		   int ans = -1;
    		   while(start <= end) {
    			   int mid = (start + end)/2;
    			   long val = s.query(0, 0, n - 1, mid, i);
    			   int st = 0;
    			   int ed = m -1;
    			   int fi = -1;
    			   while(st <= ed) {
    				   int mid1 = (st + ed)/2;
    				   if(p[mid1].x.compareTo(val)>=0) {
    					   fi = mid1;
    					   ed = mid1 -1;
    				   }
    				   else
    					   st = mid1 +1;
    			   }
    			   if(fi == -1) {
    				   start = mid + 1;
    			   }
    			   else if(pre[fi] >= (i - mid + 1) ) {
    				   ans  = mid;
    				   end = mid - 1;
    			   }
    			   else
    				   start = mid +1;
    		   }
    		   if(ans  == -1) {
    			   pw.println(-1);
    			   continue outer;
    		   }
    		   else if(ans == 0) {
    			   dp[i] = 1;
    		   }
    		   else
    			   dp[i] = dp[ans - 1] + 1L;
    	   }
    	   pw.println(dp[n - 1]);
       }
        pw.flush();
        pw.close();
    }
    public static void main(String[] args) throws Exception {
        
        
        new Thread(null,new Runnable() {
            public void run() {
                    try {
						new Myclass().solve();
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
            }
        },"1",1<<26).start();
        
        
    }
   
    static void debug(Object... o) {
        System.out.println(Arrays.deepToString(o));
        }
        
        static class InputReader 
        {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, snumChars;
        private SpaceCharFilter filter;
 
        public InputReader(InputStream stream) 
        {
            this.stream = stream;
        }
        public int snext() 
        {
            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) 
            {
                curChar = 0;
                try 
                {
                    snumChars = stream.read(buf);
                } 
                catch (IOException e) 
                {
                    throw new InputMismatchException();
                }
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
 
        public int nextInt() 
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-')
            {
                sgn = -1;
                c = snext();
            }
            int res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public long nextLong()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-') 
            {
                sgn = -1;
                c = snext();
            }
            long res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int[] nextIntArray(int n) 
        {
            int a[] = new int[n];
            for (int i = 0; i < n; i++) 
            {
                a[i] = nextInt();
            }
            return a;
        }
 
        public String readString()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isSpaceChar(c));
            return res.toString();
        }
 
        public String nextLine() 
        {
            int c = snext();
            while (isSpaceChar(c))
                c = snext();
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isEndOfLine(c));
            return res.toString();
        }
 
        public boolean isSpaceChar(int c) 
        {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
 
        private boolean isEndOfLine(int c) 
        {
            return c == '\n' || c == '\r' || c == -1;
        }
 
        public interface SpaceCharFilter
        {
            public boolean isSpaceChar(int ch);
        }
    }
        public static long mod = 1000000007;
        public static int d;
        public static int p;
        public static int q;
        public void extended(int a,int b) {
            if(b==0) {
                d=a;
                p=1;
                q=0;
            }
            else
            {
                extended(b,a%b);
                int temp=p;
                p=q;
                q=temp-(a/b)*q;
            }
        }
       
        
        public static long binaryExponentiation(long x,long n)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
        public static long[] shuffle(long[] a,Random gen)
        {
            int n = a.length;
            for(int i=0;i<n;i++)
            {
                int ind = gen.nextInt(n-i)+i;
                long temp = a[ind];
                a[ind] = a[i];
                a[i] = temp;
            }
            return a;
        }
        
        public static void swap(int a, int b){
            int temp = a;
            a = b;
            b = temp;
        }
        
        public static HashSet<Integer> primeFactorization(int n)
        {
            HashSet<Integer> a =new HashSet<Integer>();
            for(int i=2;i*i<=n;i++)
            {
                while(n%i==0)
                {
                    a.add(i);
                    n/=i;
                }
            }
            if(n!=1)
                a.add(n);
            return a;
        }
        
        public static void sieve(boolean[] isPrime,int n)
        {
            for(int i=1;i<n;i++)
                isPrime[i] = true;
            
            isPrime[0] = false;
            isPrime[1] = false;
            
            for(int i=2;i*i<n;i++)
            {
                if(isPrime[i] == true)
                {
                    for(int j=(2*i);j<n;j+=i)
                        isPrime[j] = false;
                }
            }
        }
        
        public static long GCD(long n,long m)
        {
            if(m==0)
                return n;
            else
                return GCD(m,n%m);
        }
        public static long LCM (long a,long b) {
            return ((a*b)/(GCD(a,b)));
        }
        
        static class pair implements Comparable<pair>
        {
           Long x;
           Integer y;
            
            pair(long seg,int seg2)
            {
                this.x=seg;
                this.y=seg2;
            }

            public int compareTo(pair o) {
                int result = x.compareTo(o.x);
                if(result==0)
                    result = y.compareTo(o.y);
                
                return result;
            }  
            
            public String toString()
            {
                return x+" "+y;
            }
            
            public boolean equals(Object o)
            {
                if (o instanceof pair)
                {
                    pair p = (pair)o;
                    return p.x == x && p.y == y ;
                }
                return false;
            }
            
            public int hashCode()
            {
                return new Double(x).hashCode()*31 + new Long(y).hashCode();
            }
        }
        public static int binaryExponentiation(int x,int n)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
       
        
        public static int modularExponentiation(int x,int n,int M)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result * x)%M;
                x=(x%M*x)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modularExponentiation(long x,long n,long M)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result%M * x%M)%M;
                x=(x%M * x%M)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modInverse(int A,int M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
        public static long modInverse(long A,long M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
         
}
class Segment{ 
	long seg[]; 
	long a[];
	long lazy[];
    Segment (int n,long b[]){
		seg=new long[4*n];
	//	lazy=new long[4*n];
		a=new long[b.length];
		a=b.clone();
	}
    public void build(int node,int start,int end) {
    	if(start==end) {
    		seg[node]=a[start];
    		return ;
    	}
    	int mid=(start+end)/2;
    	build(2*node+1,start,mid);
    	build(2*node+2,mid+1,end);
    	seg[node]=Math.max(seg[2*node+1],seg[2*node+2]);
    }
    public void update(int node,int start,int end,int id,int val) {
    	if(start==end) {
    		seg[node]=a[start]=val;
    		return;
    	}
    	int mid=(start+end)/2;
    	if(id>=start && id<=mid) {
    		update(2*node+1,start,mid,id,val);
    	}
    	else
    		update(2*node+2,mid+1,end,id,val);
    	seg[node]=Math.max(seg[2*node+1],seg[2*node+2]);
    }
    public long query(int node,int start,int end,int l,int r) {
    	if(l>end || r<start)
    		return 0;
    	if(start>=l && end<=r)
    		return seg[node];
    	
    	int  mid=(start+end)/2;
    	return Math.max(query(2*node+1,start,mid,l,r),query(2*node+2,mid+1,end,l,r));
    }
    /*public void updateRange(int node,int start,int end,int l,int r,int val) {
    	if(lazy[node]!=0) {
    		if(start!=end) {
    			lazy[2*node+1]+=lazy[node];
    			lazy[2*node+2]+=lazy[node];
    		}
    		lazy[node]=0;
    	}
    	if(l>end || r<start)
    		return ;
    	if(start>=l && end<=r) {
    		seg[node]=(end-start+1)*val;
    		if(start!=end) {
    			lazy[2*node+1]+=val;
    			lazy[2*node+2]+=val;
    		}
    		lazy[node]=0;
    		return ;
    	}
    	int mid=(start+end)/2;
    	updateRange(2*node+1,start,mid,l,r,val);
    	updateRange(2*node+2,mid+1,end,l,r,val);
    	seg[node]=seg[2*node+1]+seg[2*node+2];
    }
    public int queryRange(int node,int start,int end,int l,int r) {
    	if(l>end || r<start)
    		return 0;
    	if(lazy[node]!=0) {
    		seg[node]=(end-start+1)*lazy[node];
    		if(start!=end) {
    			lazy[2*node+1]+=lazy[node];
    			lazy[2*node+2]+=lazy[node];
    		}
    		lazy[node]=0;
    	}
    	if(start>=l && end<=r)
    		return seg[node];
    	
    	int  mid=(start+end)/2;
    	return (query(2*node+1,start,mid,l,r)+query(2*node+2,mid+1,end,l,r));
    }*/
    
}
