#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
void pr(const pair<T1, T2>& x);
template <class T, size_t SZ>
void pr(const array<T, SZ>& x);
template <class T>
void pr(const vector<T>& x);
template <class T>
void pr(const set<T>& x);
template <class T1, class T2>
void pr(const map<T1, T2>& x);
template <class T>
void pr(const T& x) {
  cout << x;
}
template <class Arg, class... Args>
void pr(const Arg& first, const Args&... rest) {
  pr(first);
  pr(rest...);
}
template <class T1, class T2>
void pr(const pair<T1, T2>& x) {
  pr("{", x.first, ", ", x.second, "}");
}
template <class T>
void prContain(const T& x) {
  pr("{");
  bool fst = 1;
  for (auto& a : x) pr(!fst ? ", " : "", a), fst = 0;
  pr("}");
}
template <class T, size_t SZ>
void pr(const array<T, SZ>& x) {
  prContain(x);
}
template <class T>
void pr(const vector<T>& x) {
  prContain(x);
}
template <class T>
void pr(const set<T>& x) {
  prContain(x);
}
template <class T1, class T2>
void pr(const map<T1, T2>& x) {
  prContain(x);
}
void ps() { pr("\n"); }
template <class Arg, class... Args>
void ps(const Arg& first, const Args&... rest) {
  pr(first, " ");
  ps(rest...);
}
template <typename T>
int remin(T& a, const T& b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
int remax(T& a, const T& b) {
  if (b > a) {
    a = b;
    return true;
  }
  return false;
}
int Q, N;
int a[300005], b[300005], segment_tree[4 * 300005];
vector<int> pos[300005];
void pa() {
  for (int i = 0; i <= N; ++i) {
    printf("%d ", segment_tree[i]);
  }
  printf("\n");
}
int query(int node, int nl, int nr, int ql, int qr) {
  if (qr >= nr && ql <= nl) return segment_tree[node];
  if (ql > nr || qr < nl) return -1;
  int mid = (nl + nr) / 2;
  int q1 = query(2 * node + 1, nl, mid, ql, qr);
  int q2 = query(2 * node + 2, mid + 1, nr, ql, qr);
  if (q1 == -1) return q2;
  if (q2 == -1) return q1;
  return min(q1, q2);
}
void update(int node, int nl, int nr, int idx, int value) {
  if (idx > nr || idx < nl) return;
  if (nl == nr) {
    segment_tree[node] = value;
    return;
  }
  int mid = (nl + nr) / 2;
  update(2 * node + 1, nl, mid, idx, value);
  update(2 * node + 2, mid + 1, nr, idx, value);
  segment_tree[node] =
      min(segment_tree[2 * node + 1], segment_tree[2 * node + 2]);
}
void solve() {
  for (int i = 0; i < N; ++i) {
    int v = b[i];
    if (!pos[v].size()) {
      printf("NO\n");
      return;
    }
    if (query(0, 0, N, 0, v) < pos[v].back()) {
      printf("NO\n");
      return;
    }
    pos[v].pop_back();
    update(0, 0, N, v, pos[v].size() ? pos[v].back() : 1E9);
  }
  printf("YES\n");
}
int main(int argc, const char** argv) {
  scanf("%d", &Q);
  for (int q = 0; q < Q; ++q) {
    scanf("%d", &N);
    for (int i = 0; i <= N; ++i) pos[i].clear();
    for (int i = 0; i < N; ++i) {
      scanf("%d", &a[i]);
      pos[a[i]].push_back(i);
    }
    for (int i = 0; i < N; ++i) {
      scanf("%d", &b[i]);
    }
    for (int i = 0; i <= N; ++i) reverse(pos[i].begin(), pos[i].end());
    for (int i = 0; i < 4 * N; ++i) segment_tree[i] = 1E9;
    for (int i = 1; i <= N; ++i) {
      if (pos[i].size()) {
        update(0, 0, N, i, pos[i].back());
      }
    }
    solve();
  }
  return 0;
}
