1 #include<iostream>
2 #include<vector>
3 #include<algorithm>
4 #include<cstring>
5 #include<cstdio>
6 using namespace std;
7
8 const int INF = 0x3f3f3f3f;
9 const int maxn = 200010;
10 int a[maxn];
11 int mon[maxn];
12 int ed[maxn];
13 int maxh[maxn];
14 int n, m;
15 vector<pair<int, int> >temp;
16
17 bool operator <(pair<int, int>a, pair<int, int>b)
18 {
19 if (a.first == b.first) return a.second < b.second;
20 return a.first < b.first;
21 }
22
23 int main()
24 {
25 int T;
26 scanf("%d",&T);
27 while (T--)
28 {
29 temp.clear();
30 scanf("%d",&n);
31 for (int i = 1; i <= n; i++)
32 {
33 scanf("%d",&mon[i]);
34 }
35 scanf("%d",&m);
36 for (int i = 1; i <= m; i++)
37 {
38 int a, b;
39 scanf("%d%d",&a,&b);
40 temp.push_back(pair<int, int>(b, a));
41 }
42 sort(temp.begin(), temp.end());
43 for (int i = 0; i < m; i++)
44 {
45 a[i + 1] = temp[i].second;
46 ed[i + 1] = temp[i].first;
47 }
48 {
49 int maxh = *max_element(a + 1, a + 1 + m);
50 int maxm = *max_element(mon + 1, mon + n + 1);
51 if (maxh < maxm)
52 {
53 //有怪谁也打不过,AK无望
54 printf("-1\n");
55 continue;
56 }
57 }
58 maxh[m]=a[m];
59 for(int i=m-1;i>0;i--)
60 {
61 maxh[i]=max(maxh[i+1],a[i]);
62 }
63 int d = 0; //当天击败数量
64 int ans = 1;
65 int maxp = -INF;
66 for (int i = 1; i <= n; i++)
67 {
68 d++;
69 maxp = max(maxp, mon[i]); //目前为止今天计划中最强的怪
70 int val = lower_bound(ed + 1, ed + 1 + m, d) - ed; //当前耐力还能继续打下去的英雄
71 int maxq = -INF;
72 if (val < m + 1) maxq = maxh[val]; //耐力值足够,在当前耐力值足够的英雄里找最能打的
73 if (val == m + 1 || maxq < maxp)
74 { //没有耐力足够的英雄打的过计划今天要打的怪里最强的
75 ans++;
76 d = 1; //用战力比这个怪强的英雄K掉这个怪
77 maxp = mon[i]; //这个怪安排到下一天
78 //进入下一天
79 }
80 }
81 printf("%d\n",ans);
82 }
83 return 0;
84 }