注释写的很详细了。
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int a[100100],la[100100];
int L[100100];
//观察只要有y x y 就行,因为其他>2的回文串一定属于这个例如:1 1 2 1 1
int main()
{
int n,q; cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(mp.count(a[i])) la[i]=mp[a[i]];
mp[a[i]]=i;//mp统计上一个a[i]出现的位置,0表示没有
}
for(int i=n;i;i--)
{
//若该数字在上一个位置,则取再前一位
if(la[i]==i-1) la[i]=la[la[i]];//la表示a[i]这个数字上一次出现的下标,并且还不是i-1
}
//la[i]表示第i个位置能构成回文值串的下标最大位置
for(int i=1;i<=n;i++) la[i]=max(la[i],la[i-1]);
while(q--)
{
int l,r; cin>>l>>r;
if(la[r]>=l) cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
return 0;
}