玄学调了inf遍模数
#include<bits/stdc++.h>
#define mod 122420729
using namespace std;
int n,x,y;
unsigned long long a[1200005][3],b[300005];
bool ok;
void build(int x,int l,int r)
{
a[x][0]=0;
a[x][1]=0;
a[x][2]=r-l+1;
if (l<r)
{
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
}
}
void modify(int x,int bl,int br,int y)
{
if (bl==br)
{
a[x][0]=1;
a[x][1]=1;
}
else
{
int mid=bl+br>>1;
if (y<=mid)
modify(x<<1,bl,mid,y);
else
modify(x<<1|1,mid+1,br,y);
a[x][0]=(a[x<<1][0]*b[br-mid]%mod+a[x<<1|1][0])%mod;
a[x][1]=(a[x<<1|1][1]*b[mid-bl+1]%mod+a[x<<1][1])%mod;
}
}
pair<unsigned long long,int> query(int x,int bl,int br,int l,int r,bool k)
{
if (l<=bl && br<=r)
return make_pair(a[x][k],a[x][2]);
int mid=bl+br>>1;
pair<unsigned long long,int> result=make_pair(0,0),res;
if (k)
{
if (mid<r)
{
res=query(x<<1|1,mid+1,br,l,r,k);
result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
}
if (l<=mid)
{
res=query(x<<1,bl,mid,l,r,k);
result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
}
}
else
{
if (l<=mid)
{
res=query(x<<1,bl,mid,l,r,k);
result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
}
if (mid<r)
{
res=query(x<<1|1,mid+1,br,l,r,k);
result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
}
}
return result;
}
int main()
{
cin>>n;
for (int i=1;i<=n;++i)
b[i]=b[i-1]*23333%mod;
build(1,1,n);
ok=0;
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
y=min(x-1,n-x);
modify(1,1,n,x);
if (y && query(1,1,n,x-y,x-1,0)!=query(1,1,n,x+1,x+y,1))
ok=1;
}
if (ok)
cout<<"YES";
else
cout<<"NO";
}