#include <bits/stdc++.h>
using namespace std;
int n;
int start[300013];
int target[300013];
struct SegtreeMin {
  int *values;
  int *lazy;
  int length;
  SegtreeMin(int len) {
    length = len;
    values = new int[4 * len];
    lazy = new int[4 * len];
    for (int i = 0; i < 4 * len; i++) {
      values[i] = 0;
      lazy[i] = 0;
    }
  }
  void prop(int i) {
    values[i] += lazy[i];
    if ((2 * i) < (4 * length)) lazy[2 * i] += lazy[i];
    if ((2 * i + 1) < (4 * length)) lazy[2 * i + 1] += lazy[i];
    lazy[i] = 0;
  }
  void update(int start, int end, int value, int i = 1, int left = 0,
              int right = 300013 - 1) {
    if (right < start || end < left || right < left) return;
    if (left == right) {
      values[i] += lazy[i];
      lazy[i] = 0;
      values[i] += value;
      return;
    }
    prop(i);
    if (start <= left && right <= end) {
      assert(false);
      lazy[i] += value;
      prop(i);
      return;
    }
    int mid = (left + right) / 2;
    update(start, end, value, 2 * i, left, mid);
    update(start, end, value, 2 * i + 1, mid + 1, right);
    prop(2 * i);
    prop(2 * i + 1);
    values[i] = min(values[2 * i], values[2 * i + 1]);
  }
  int query(int start, int end, int i = 1, int left = 0,
            int right = 300013 - 1) {
    if (right < start || end < left || right < left) return 1000000000;
    if (left == right) {
      values[i] += lazy[i];
      lazy[i] = 0;
      return values[i];
    }
    prop(i);
    if (start <= left && right <= end) {
      return values[i];
    }
    int mid = (left + right) / 2;
    prop(2 * i);
    prop(2 * i + 1);
    return min(query(start, end, 2 * i, left, mid),
               query(start, end, 2 * i + 1, mid + 1, right));
  }
};
int main() {
  if (fopen("FILENAME.in", "r")) {
    freopen("FILENAME.in", "r", stdin);
    freopen("FILENAME.out", "w", stdout);
  }
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int t;
  cin >> t;
  while (t--) {
    cin >> n;
    SegtreeMin helper(n);
    vector<stack<int>> indices(n, stack<int>());
    for (int i = 0; i < n; i++) {
      cin >> start[i];
      start[i]--;
    }
    for (int i = n - 1; i >= 0; i--) {
      indices[start[i]].push(i);
    }
    for (int i = 0; i < n; i++) {
      helper.update(i, i, start[i], 1, 0, n - 1);
    }
    for (int i = 0; i < n; i++) {
      cin >> target[i];
      target[i]--;
    }
    bool bad = false;
    for (int i = 0; i < n; i++) {
      if (indices[target[i]].size() == 0) {
        bad = true;
        break;
      }
      int position = indices[target[i]].top();
      indices[target[i]].pop();
      int queryValue = helper.query(0, position - 1, 1, 0, n - 1);
      if (queryValue < target[i]) {
        bad = true;
        break;
      }
      helper.update(position, position, 1000000000, 1, 0, n - 1);
    }
    if (bad) {
      cout << "NO" << '\n';
    } else {
      cout << "YES" << '\n';
    }
  }
}
