#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define int long long
using namespace std;
const int N = 1e6 + 10, b = 2333, mod = 1145141919810;
struct tree
{
int l, r;
int hash, siz;
}tr[4 * N], trp[4 * N];
int base[N], a[N];
int n;
void pushup(tree &u, tree &l, tree &r)
{
u.siz = u.r - u.l + 1;
u.hash = (l.hash * base[r.siz] % mod + r.hash) % mod;
}
void pushup(int u, tree tr[])
{
pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}
void build(int u, int l, int r, tree tr[])
{
tr[u] = {l, r};
if(l == r)
{
tr[u].hash = 1;
tr[u].siz = 1;
return ;
}
int mid = l + r >> 1;
build(u << 1, l, mid, tr), build(u << 1 | 1, mid + 1, r, tr);
pushup(u, tr);
}
void modify(int u, int x, int v, tree tr[])
{
if(tr[u].l == tr[u].r) tr[u].hash = v;
else
{
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid) modify(u << 1, x, v, tr);
if(x > mid) modify(u << 1 | 1, x, v, tr);
}
pushup(u, tr);
}
tree query(int u, int l, int r, tree tr[])
{
if(tr[u].l >= l && tr[u].r <= r) return tr[u];
int mid = tr[u].l + tr[u].r >> 1;
if(r <= mid) return query(u << 1, l, r, tr);
if(l > mid) return query(u << 1 | 1, l, r, tr);
tree ans, left, right;
left = query(u << 1, l, r, tr);
right = query(u << 1 | 1, l, r, tr);
pushup(ans, left, right);
return ans;
}
bool check(int l, int r)
{
int ha = query(1, l, r, tr).hash;
int hb = query(1, n - r + 1, n - l + 1, trp).hash;
return ha != hb;
}
bool solve(int mid)
{
int len = min(n - mid, mid - 1);
return check(mid - len, mid + len);
}
signed main()
{
int T;
scanf("%lld", &T);
base[0] = 1;
for(int i = 1; i < 5e5; i++) base[i] = base[i - 1] * b % mod;
while(T--)
{
scanf("%lld", &n);
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
build(1, 1, n, tr);
build(1, 1, n, trp);
bool f = false;
for(int i = 1; i <= n; i++)
{
if(a[i] == 1 || a[i] == n)
{
modify(1, a[i], 0, tr);
modify(1, n - a[i] + 1, 0, trp);
continue;
}
if(solve(a[i]))
{
f = true;
break;
}
modify(1, a[i], 0, tr);
modify(1, n - a[i] + 1, 0, trp);
}
if(f)puts("Y");
else puts("N");
}
}