func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   vector<int> a;   vector<stack<int>> ids;   vector<int> b;   string answer;   int segtree_size;   template <typename T>   struct segtree {     int segtree_size;     vector<T> segtree;     T identity;     T (*UpdateFn)(T, T);     void InitSegtree(int main_size, T (*UpdateFunction)(T, T), T fun_identity) {       segtree_size = 1;       while (segtree_size < main_size) segtree_size *= 2;       segtree_size *= 2;       segtree.resize(segtree_size);       UpdateFn = UpdateFunction;       this->identity = fun_identity;     }     void UpdateAllParents() {       for (int i = segtree_size / 2 - 1; i > 0; i--)         segtree[i] = UpdateFn(segtree[i * 2], segtree[i * 2 + 1]);     }     void ChangeValue(int index, T value) {       segtree[index + segtree_size / 2] = value;     }     T GetValue(int index) { return segtree[index + segtree_size / 2]; }     void Update(int pos, T value) {       for (segtree[pos += segtree_size / 2] = value; pos > 1; pos /= 2)         segtree[pos / 2] = UpdateFn(segtree[pos], segtree[pos ^ 1]);     }     T Query(int start, int finish) {       T ans = this->identity;       for (start += segtree_size / 2, finish += segtree_size / 2; start < finish;            start /= 2, finish /= 2) {         if (start % 2 == 1) ans = UpdateFn(ans, segtree[start++]);         if (finish % 2 == 0) ans = UpdateFn(ans, segtree[finish--]);       }       return UpdateFn(ans, segtree[start]);     }     void Destroy() { segtree.clear(); }   };   struct segtree<int> tree;   void In() {     cin >> n;     a.resize(n);     ids.resize(n + 1);     b.resize(n);     for (int i = 0; i < n; i++) cin >> a[i];     for (int i = 0; i < n; i++) cin >> b[i];   }   void Solve() {     tree.InitSegtree(         n + 1, [](int a, int b) -> int { return max(a, b); }, INT_MIN);     for (int i = 0; i < n; i++) tree.ChangeValue(i, a[i]);     tree.UpdateAllParents();     answer =  NO ;     for (int i = 0; i < n; i++) ids[a[i]].push(i);     for (int i = n - 1; i >= 0; i--) {       if (ids[b[i]].empty()) return;       int a_idx = ids[b[i]].top();       ids[b[i]].pop();       if (tree.Query(a_idx + 1, n) > b[i]) return;       tree.Update(a_idx, 0);     }     answer =  YES ;   }   void Out() {     cout << answer << endl;     tree.Destroy();     a.clear();     ids.clear();     b.clear();   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     int t;     cin >> t;     while (t--) {       In();       Solve();       Out();     }     return 0;   }   