rt,而且 O(qnlogV) 应该是可以过的啊,或者请大佬调调块长
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,V=2e5,inf=0x3f3f3f3f;
struct query{int l,r,id;}q[N];
int sum[N<<2],pos[N<<2],a[N],L[N],R[N],poss[N],ans[N];
inline bool cmp(const query&q1,const query&q2){return poss[q1.l]!=poss[q2.l]?q1.l<q2.l:q1.r<q2.r;}
inline void pushup(const int&p)
{
sum[p]=sum[p<<1]+sum[p<<1|1];
pos[p]=min(pos[p<<1],pos[p<<1|1]);
}
void build(const int&p,const int&pl,const int&pr)
{
if(pl==pr)
{
pos[p]=pl;
return ;
}
int mid=(pl+pr)>>1;
build(p<<1,pl,mid);
build(p<<1|1,mid+1,pr);
pushup(p);
}
void update(const int&p,const int&pl,const int&pr,const int&x,const int&d)
{
if(x<pl||pr<x)
return ;
if(pl==pr)
{
if(sum[p]==0)
pos[p]=inf;
sum[p]+=d;
if(sum[p]==0)
pos[p]=x;
return ;
}
int mid=(pl+pr)>>1;
update(p<<1,pl,mid,x,d);
update(p<<1|1,mid+1,pr,x,d);
pushup(p);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n>>m;
const int tt=sqrt(n);
int t=n/tt;
for(int i=1;i<=n;++i)
cin>>a[i];
build(1,0,V);
for(int i=1;i<=t;++i)
L[i]=(i-1)*t+1,R[i]=i*t;
if(R[t]<n)
{
++t;
L[t]=R[t-1]+1;
R[t]=n;
}
for(int i=1;i<=t;++i)
for(int j=L[i];j<=R[i];++j)
poss[j]=i;
for(int i=1;i<=m;++i)
cin>>q[i].l>>q[i].r,q[i].id=i;
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;++i)
{
while(l>q[i].l)
{
--l;
update(1,0,V,a[l],1);
}
while(r>q[i].r)
{
update(1,0,V,a[r],-1);
--r;
}
while(r<q[i].r)
{
++r;
update(1,0,V,a[r],1);
}
while(l<q[i].l)
{
update(1,0,V,a[l],-1);
++l;
}
ans[q[i].id]=pos[1];
}
for(int i=1;i<=m;++i)
cout<<ans[i]<<'\n';
}