rt.
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define int long long
#define PII pair<int,int>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e6+5,base=13,MOD=1e9+7;
int a[N],p[N],T,n;
struct node {
int hash1,hash2,l,r;
}; node tree[N<<2];
#define ls(k) (k<<1)
#define rs(k) (k<<1|1)
void push_up(int k) {
int len_l=tree[ls(k)].r-tree[ls(k)].l+1,len_r=tree[rs(k)].r-tree[rs(k)].l+1;
tree[k].hash1=(tree[ls(k)].hash1*p[len_r]%MOD+tree[rs(k)].hash1)%MOD;
tree[k].hash2=(tree[rs(k)].hash2*p[len_l]%MOD+tree[ls(k)].hash2)%MOD;
}
void build(int k,int l,int r) {
tree[k]={0,0,l,r};
if(l==r)
return;
int mid=(l+r)>>1;
build(ls(k),l,mid);
build(rs(k),mid+1,r);
push_up(k);
}
void update(int k,int qx,int val) {
if(tree[k].l==tree[k].r) {
tree[k].hash1=tree[k].hash2+=val; return;
}
if(qx<=tree[ls(k)].r)
update(ls(k),qx,val);
if(qx>=tree[rs(k)].l)
update(rs(k),qx,val);
push_up(k);
}
int query1(int k,int l,int r) {
if(l>r) return 0;
if(l<=tree[k].l&&tree[k].r<=r)
return tree[k].hash1;
if(r<=tree[ls(k)].r)
return query1(ls(k),l,r);
else if(l>=tree[rs(k)].l)
return query1(rs(k),l,r);
else
return (query1(ls(k),l,r)*p[r-tree[rs(k)].l+1]%MOD+query1(rs(k),l,r))%MOD;
}
int query2(int k,int l,int r) {
if(l>r) return 0;
if(l<=tree[k].l&&tree[k].r<=r)
return tree[k].hash2;
if(r<=tree[ls(k)].r)
return query2(ls(k),l,r);
else if(l>=tree[rs(k)].l)
return query2(rs(k),l,r);
else
return (query2(rs(k),l,r)*p[tree[ls(k)].r-l+1]%MOD+query2(ls(k),l,r))%MOD;
}
void init() {
p[0]=1;
rep(i,1,N-1)
p[i]=p[i-1]*base%MOD;
}
signed main() {
scanf("%lld",&T); init();
while(T--) {
cl(tree,0);
scanf("%lld",&n);
build(1,1,n);
bool flag=false;
rep(i,1,n) {
scanf("%lld",&a[i]);
int len=min(n-a[i],a[i]-1);
if(query1(1,a[i]-len,a[i]-1)!=query2(1,a[i]+1,a[i]+len))
flag=true;
update(1,a[i],1);
}
puts(flag? "Y":"N");
}
return 0;
}
求 hack 数据。