#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int a[N];
int b[N];
int pos[N];
int vis[N];
int l[N];
int c[N];
int n,m,k;
multiset<int> st;
int lowbit(int x)
{
return x&-x;
}
void change(int x,int y)
{
while(x<=n)
{
c[x]+=y;
x+=lowbit(x);
}
}
int ask(int x)
{
int ans=0;
while(x)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
void init(int n)
{
st.clear();
for(int i=1;i<=n;i++)
{
pos[i]=0;
vis[i]=0;
c[i]=0;
}
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
cin>>n>>m>>k;
init(n);
for(int i=1;i<=n;i++)
{
cin>>a[i];
pos[a[i]]=i;
}
for(int i=1;i<=m;i++)
{
cin>>b[i];
vis[b[i]]=1;
}
for(int i=1;i<=k;i++)
{
cin>>l[i];
st.insert(l[i]);
}
set<int> st1;
bool flag=0;
for (int i = 1, j = 1; i <= m; ++i)
{
while (j <= n && a[j] != b[i])
j++;
if (j > n)
{
flag=1;
break;
}
}
if(flag)
{
cout<<"NO"<<endl;
continue;
}
for(int i=1;i<=n;i++)
{
change(i,1);
}
st1.insert(0);
st1.insert(n+1);
for(int i=n;i>=1;i--)
{
if(vis[i])
{
st1.insert(pos[i]);
continue;
}
auto it1 = st1.lower_bound(pos[i]),it2=prev(it1);
int temp1 = ask(*it1-1)-ask(*it2);
auto it = st.upper_bound(temp1);
if(it==st.begin())
{
flag=1;
break;
}
change(pos[i],-1);
st.erase(--it);
}
if(flag) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
2022icpc香港L
最新推荐文章于 2024-07-18 11:20:52 发布