rt,写的普通莫队+值域分块,不知为何听取RE一片(
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+2;
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){x=x*10+(c^48);c=getchar();}
return x;
}
int n,m,len,a[N],id[N],cnt[N],cntb[N],ans[N];
struct query
{
int l,r,qid;
friend bool operator < (query a,query b)
{
return id[a.l]!=id[a.r]?id[a.l]<id[a.r]:((id[a.l]&1)?a.r<b.r:a.r>b.r);
}
}q[N];
void add(int x)
{
cnt[a[x]]++,cntb[id[a[x]]]++;
}
void del(int x)
{
cnt[a[x]]--,cntb[id[a[x]]]--;
}
int query(int x)
{
for(int i=1;i<=id[n];i++)
{
if(cntb[i]*2>x)
{
for(int j=(i-1)*len+1;id[j]==i&&j<=n;j++)
if(cnt[j]*2>x)
return j;
return 0;
}
}
return 0;
}
int main()
{
n=read(),m=read();
len=sqrt(n);
for(int i=1;i<=n;i++)
{
a[i]=read();
id[i]=(i-1)/len+1;
}
int u,v;
for(int i=1;i<=m;i++)
{
u=read(),v=read();
q[i]={u,v,i};
}
sort(q+1,q+1+m);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
int L=q[i].l,R=q[i].r;
while(l>L)
add(--l);
while(r<R)
add(++r);
while(l<L)
del(l++);
while(r>R)
del(r--);
ans[q[i].qid]=query(R-L+1);
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}