#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
typedef long long ll;
typedef vector <ll> vll;
typedef set <ll> sll;
typedef vector <vector<ll>> vvll;
typedef set<pair<ll,ll>> spll;
typedef vector <bool> vbl;
typedef vector <pair<ll,ll>> vpll;
typedef map <ll,ll> mll;

#define yen cout<<"YES"<<"\n"
#define ye cout<<"YES"
#define non cout<<"NO"<<"\n"
#define no cout<<"NO"
#define pb push_back
#define bk break
#define co continue
#define ff first
#define ss second
#define f(i, a, b) for (long long i = (a); i <= (b); i++)
#define fr(i, a, b) for (long long i = (b); i >= (a); i--)

ll LMA=LLONG_MAX;
ll LMI=LLONG_MIN;

void pr(vector <ll> &v)
{
    ll sz=v.size();
    sz-=2;
    for (ll i=1;i<=sz;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<"\n";
}

void pr0(vector <ll> &v)
{
    for (auto elem:v)
    {
        cout<<elem<<" ";
    }
    cout<<"\n";
}

template<typename T>
using ordered_set = tree<
    T,
    null_type,
    less<T>,
    rb_tree_tag,
    tree_order_statistics_node_update>;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    ll t=1;
    cin>>t;
    
    while (t--)
    {
        ll n;
        cin>>n;
        vll pref(n+2);
        vll suf(n+2);
        for (ll i=1;i<=n;i++)
        {
            cin>>pref[i];
        }
        for (ll i=1;i<=n;i++)
        {
            cin>>suf[i];
        }
        bool poss=true;
        for (ll i=1;i<=(n-1);i++)
        {
            if (pref[i]>pref[i+1])
            {
                poss=false;
                break;
            }
        }
        for (ll i=n;i>=2;i--)
        {
            if (suf[i]>suf[i-1])
            {
                poss=false;
                break;
            }
        }
        if (!poss)
        {
            cout<<"NO"<<"\n";
            continue;
        }
        ll ind=0;
        for (ll i=1;i<=n;i++)
        {
            if (pref[i]!=0)
            {
                ind=i;
                break;
            }
        }
        for (ll i=n;i>=(ind+1);i--)
        {
            if (suf[i]!=0)
            {
                poss=false;
                break;
            }
        }
        if (!poss)
        {
            cout<<"NO"<<"\n";
            continue;
        }
        for (ll i=1;i<=n;i++)
        {
            if (pref[i]>i)
            {
                poss=false;
                break;
            }
        }
        for (ll i=n;i>=1;i--)
        {
            if (suf[i]>(n-i+1))
            {
                poss=false;
                break;
            }
        }
        if (pref[n]!=n || suf[1]!=n)
        {
            poss=false;
        }
        if (!poss)
        {
            cout<<"NO"<<"\n";
            continue;
        }
        vll answer(n+2,-1);
        vbl vis(n+2,false);
        for (ll i=n;i>=2;i--)
        {
            if (pref[i]!=pref[i-1])
            {
                vis[pref[i-1]]=true;
                answer[i]=pref[i-1];
            }
        }
        for (ll i=1;i<=(n-1);i++)
        {
            if (suf[i]!=suf[i+1])
            {
                if (answer[i]== -1)
                {
                    if (vis[suf[i+1]])
                    {
                        poss=false;
                        break;
                    } else if (!vis[suf[i+1]])
                    {
                        answer[i]=suf[i+1];
                        vis[suf[i+1]]=true;
                    }
                } else if (answer[i]!= -1)  // will only occur at index=ind. where, 0 will be there!
                {
                    if (answer[i]!=suf[i+1])
                    {
                        poss=false;
                        break;
                    }
                }
            }
        }
        if (!poss)
        {
            cout<<"NO"<<"\n";
            continue;
        }
        cout<<"YES"<<"\n";
    }
    
    return 0;
}