这题是我实现太烂了?还是分块就是会被卡?
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
using std::cin;using std::cout;
constexpr int N=500005;
int n,q,a[N],l,r,ans,cnt[N];
struct node{int k,len;std::vector<int>a;}edge[N];
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
std::ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>q;
for(int i=1;i<=n;++i){
cin>>a[i];edge[a[i]].k=a[i];
edge[a[i]].a.push_back(i);
++edge[a[i]].len;
}
std::sort(edge+1,edge+n+1,[](node a,node b){return a.len>b.len;});
for(int i=1;i<=q;++i){
cin>>l>>r;ans=0;
if(r-l+1<sqrt(2.5*n)){
for(int j=l;j<=r;++j) ++cnt[a[j]];
for(int j=l;j<=r;++j){
if(cnt[a[j]]>((r-l+1)>>1))
if(ans==0||a[j]<ans)
ans=a[j];
cnt[a[j]]=0;
}
cout<<ans<<'\n';
continue;
}
for(int j=1;j<=n&&edge[j].len>((r-l+1)>>1);++j){
int lans=-1,rans=-1,L=0,R=edge[j].len-1;
while(L<=R){
int mid=(L+R)>>1;
if(l<=edge[j].a[mid]) lans=mid,R=mid-1;
else L=mid+1;
}
L=0,R=edge[j].len-1;
while(L<=R){
int mid=(L+R)>>1;
if(edge[j].a[mid]<=r) rans=mid,L=mid+1;
else R=mid-1;
}
// cout<<lans<<' '<<rans<<'\n';
if(lans!=-1&&rans!=-1&&(rans-lans+1)>((r-l+1)>>1))
if(ans==0||edge[j].k<ans)
ans=edge[j].k;
}
cout<<ans<<'\n';
}
return 0;
}