#include <bits/stdc++.h>
#define
#define
const int N = 3e5 + 10;
int a[N], b[N];
namespace segmentTree{
const int INF = 1e9 + 7;
int tree[N << 2];
#define
#define
inline void push_up(int rt){ tree[rt] = std::min(tree[rt << 1], tree[rt << 1 | 1]); }
inline void build(int rt, int l, int r){
if(l == r){
tree[rt] = INF;
return;
}
int mid = l + r >> 1;
build(lson), build(rson);
push_up(rt);
}
inline void update(int rt, int l, int r, int pos, int val){
if(l == r){
tree[rt] = val;
return;
}
int mid = l + r >> 1;
if(mid >= pos) update(lson, pos, val);
else update(rson, pos, val);
push_up(rt);
}
inline int query(int rt, int l, int r, int L, int R){
if(l >= L && r <= R) return tree[rt];
int mid = l + r >> 1, ans = INF;
if(mid >= L) ans = std::min(ans, query(lson, L, R));
if(mid < R) ans = std::min(ans, query(rson, L, R));
return ans;
}
}
std::queue<int> q[N];
inline void solve(){
int n = 0; std::cin >> n; segmentTree::build(1, 1, n);
for(int i = 1; i <= n; i++) while(q[i].size()) q[i].pop();
for(int i = 1; i <= n; i++) std::cin >> a[i], q[a[i]].emplace(i), segmentTree::update(1, 1, n, i, a[i]);
for(int i = 1; i <= n; i++) std::cin >> b[i];
for(int i = 1; i <= n; i++){
if(!q[b[i]].size()) { std::cout << "NO" << endl; return; }
int now = q[b[i]].front(); q[b[i]].pop();
int t = segmentTree::query(1, 1, n, 1, now);
if(t != b[i]) { std::cout << "NO" << endl; return; }
segmentTree::update(1, 1, n, now, segmentTree::INF);
}
std::cout << "YES" << endl;
}
signed main(){
std::ios_base::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
int t = 0; std::cin >> t;
while(t--) solve();
return 0;
}