#include<iostream>
#include<cmath>
#include<algorithm>
#define isdigit(x) ((x) >= '0' && (x) <= '9')
using namespace std;
int belong[300010],m,n,c,a[300010];
int ans,maxc,maxid,solc[300010];
bool sol[300010];
int vis[20010];
struct query{
int l,r,id;
} q[300010];
bool cmp(query a, query b) {
return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
void add(int pos){
vis[a[pos]]++;
maxc=max(maxc,vis[a[pos]]);
if(maxc==vis[a[pos]]) maxid=a[pos];
}
void del(int pos)
{
vis[a[pos]]--;
}
int read() {
int res = 0;
char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)) res = (res << 1) + (res << 3) + c - 48, c = getchar();
return res;
}
int main()
{
n=read();c=read();
for(int i=1;i<=n;i++) a[i]=read();
m=read();
for(int i=1;i<=m;i++){
q[i].l=read(),q[i].r=read();
q[i].id=i;
}
int size=sqrt(n);int upper=ceil(double(n/size));
for(int i=1;i<=upper;i++)
{
for(int j=(i-1)*size+1;j<=i*size;j++){
belong[j]=i;
}
}
sort(q+1,q+m+1,cmp);
int nl=1,nr=0;
for(int i=1;i<=m;i++)
{
maxc=0;maxid=0;
int ql=q[i].l,qr=q[i].r;
while(nl < ql) del(nl++);
while(nl > ql) add(--nl);
while(nr < qr) add(++nr);
while(nr > qr) del(nr--);
int k=(qr-ql+1)/2;
if(maxc>k) sol[q[i].id]= true,solc[q[i].id]=maxid;
else sol[q[i].id]=false;
}
for(int i=1;i<=m;i++){
if(sol[i]) printf("yes %d",solc[i]);
else printf("no");
printf("\n");
}
return 0;
}
样例是过了的,用的模板也A了其他几个板子
(S组蒟蒻为了骗分的最后一搏