#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=3e5+10,mod=1e9+7,base=11;
long long po[N];
struct Segment
{
int l,r,len;
long long data;
}tr1[N<<4],tr2[N<<4];
LL merge(Segment a,Segment b){
return a.data*po[b.len]%mod+b.data%mod;
}
void pushup(int p){
tr1[p].data=merge(tr1[p<<1],tr1[p<<1|1]);
tr2[p].data=merge(tr2[p<<1|1],tr2[p<<1]);
tr1[p].len=tr2[p].len=tr1[p<<1].len+tr1[p<<1|1].len;
}
void build(int now,int l,int r){
tr1[now].l=tr2[now].l=l;
tr2[now].r=tr1[now].r=r;
if(l==r){
tr1[now].data=tr2[now].data=0;
tr1[now].len=tr2[now].len=1;return ;
}
int mid=(l+r)>>1;
build(now<<1,l,mid);build(now<<1|1,mid+1,r);
pushup(now);
}
void modify(int now,int x,int val)
{
if(tr1[now].l==tr1[now].r) {
tr1[now].data=tr2[now].data=val;return ;
}
int mid=(tr1[now].l+tr1[now].r)>>1;
if(x<=mid) modify(now<<1,x,val);
else modify(now<<1|1,x,val);
pushup(now);
}
LL query1(int now,int l,int r)
{
if(l<=tr1[now].l&&tr1[now].r<=r) return tr1[now].data;
int mid=(tr1[now].l+tr1[now].r)>>1;
long long ans=0;
if(l<=mid) ans=query1(now<<1,l,r);
if(r>mid) ans=(ans*po[tr1[now<<1|1].len]+query1(now<<1|1,l,r))%mod;
return ans;
}
LL query2(int now,int l,int r){
if(l<=tr2[now].l&&tr2[now].r<=r) return tr2[now].data;
int mid=(tr2[now].l+tr2[now].r)>>1;
long long ans=0;
if(r>mid) ans=query2(now<<1|1,l,r)%mod;
if(l<=mid) ans=(ans*po[tr2[now<<1].len]+query2(now<<1,l,r))%mod;
return ans;
}
int n;
int main(){
scanf("%d",&n);
po[0]=1;
for(int i=1;i<=n;i++) po[i]=po[i-1]*base%mod;
build(1,1,n);
for(int i=1;i<=n;i++){
int t;
scanf("%d",&t);
modify(1,t,1);
int l=min(t-1,n-t);
if(l<=0) continue;
LL d1=query1(1,t-l,t-1),d2=query2(1,t+1,t+l);
if(d1!=d2){
cout<<"YES"<<endl;return 0;
}
}
cout<<"NO"<<endl;
return 0;
}