放松一下,直接树上二分就好了。
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 500020
using namespace std;
int n,m,ls[maxn*20],rs[maxn*20],s[maxn*20],num,rt[maxn];
void insert(int x,int& y,int l,int r,int id){
y=++num;ls[y]=ls[x],rs[y]=rs[x],s[y]=s[x]+1;
if(l==r)return ;
int mid=l+r>>1;
if(id>mid)insert(rs[x],rs[y],mid+1,r,id);
else insert(ls[x],ls[y],l,mid,id);
}
int query(int x,int y,int l,int r,int k){
if(l==r){
if(s[y]-s[x]>k)return l;
else return 0;
}
int mid=l+r>>1;
if(s[ls[y]]-s[ls[x]]>k)return query(ls[x],ls[y],l,mid,k);
else if(s[rs[y]]-s[rs[x]]>k)return query(rs[x],rs[y],mid+1,r,k);
else return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int x,i=1;i<=n;i++){
scanf("%d",&x);
insert(rt[i-1],rt[i],1,n,x);
}
int a,b;
while(m--){
scanf("%d%d",&a,&b);
printf("%d\n",query(rt[a-1],rt[b],1,n,(b-a+1)/2));
}
return 0;
}