用st表维护,wa on test2
#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int a[N], b[N];
int st[N][25];
void solve()
{
unordered_map<int, vector<int>> S;
unordered_map<int, int> Have;
int n, m;
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ ) scanf("%d", &b[i]);
scanf("%d", &m);
for (int i = 1, y; i <= m; i ++ )
{
scanf("%d", &y);
Have[y] ++ ;
}
for (int i = 1; i <= n; i ++ )
if (a[i] < b[i])
{
puts("NO");
return;
}
for (int i = 1; i <= n; i ++ )
{
st[i][0] = b[i];
for (int j = 1; j <= 20; j ++ )
if (i - (1 << j) >= 0)
st[i][j] = max(st[i][j - 1], st[i - (1 << j - 1)][j - 1]);
}
for (int i = 1; i <= n; i ++ )
{
if (S[b[i]].size() == 0)
{
S[b[i]].push_back(i);
if (a[i] == b[i]) continue;
Have[b[i]] -- ;
if (Have[b[i]] < 0)
{
puts("NO");
return;
}
continue;
}
if (S[b[i]].back() + 1 == i) continue;
int l = S[b[i]].back() + 1;
int g = (int)log2(i - l);
int h = max(st[i - 1][g], st[l + (1 << g) - 1][g]);
if (h > b[i])
{
S[b[i]].push_back(i);
if (a[i] == b[i]) continue;
Have[b[i]] -- ;
if (Have[b[i]] < 0)
{
puts("NO");
return;
}
}
}
puts("YES");
}
int main()
{
int T;
scanf("%d", &T);
while (T -- ) solve();
return 0;
}