很裸的板子题。
就当把模板打得熟练点罢了。
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,q,m,x,y,t,cnt;
int a[N],b[N],ll[N<<5],rr[N<<5],sum[N<<5],T[N<<5];
int build(int l,int r)
{
int rt=++cnt;
ll[rt]=rr[rt]=sum[rt]=0;
if (l<r)
{
int mid=l+r>>1;
ll[rt]=build(l,mid);
rr[rt]=build(mid+1,r);
}
return rt;
}
int change(int pre,int l,int r,int x)
{
int rt=++cnt;
ll[rt]=ll[pre]; rr[rt]=rr[pre]; sum[rt]=sum[pre]+1;
if (l<r)
{
int mid=l+r>>1;
if (x<=mid) ll[rt]=change(ll[pre],l,mid,x);
else rr[rt]=change(rr[pre],mid+1,r,x);
}
return rt;
}
int query(int u,int v,int l,int r,int x)
{
if (l==r) return l;
int mid=l+r>>1;
if (2*(sum[ll[v]]-sum[ll[u]])>x) return query(ll[u],ll[v],l,mid,x);
if (2*(sum[rr[v]]-sum[rr[u]])>x) return query(rr[u],rr[v],mid+1,r,x);
return 0;
}
int main(){
scanf("%d%d",&n,&q);
for (register int i=1; i<=n; ++i) scanf("%d",&a[i]),b[i]=a[i];
sort(a+1,a+n+1);
m=unique(a+1,a+n+1)-a-1;
T[0]=build(1,m);
for (register int i=1; i<=n; ++i)
{
t=lower_bound(a+1,a+m+1,b[i])-a;
T[i]=change(T[i-1],1,m,t);
}
while (q--)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(T[x-1],T[y],1,m,y-x+1));
}
return 0;
}