学一发主席树QAQ
还是很好理解的嘛。
静态区间K大
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,lim,size;
int root[500005];
int l[10000005],r[10000005],sum[10000005];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
void update(int ll,int rr,int x,int &y,int v)
{
y=++size;
sum[y]=sum[x]+1;
if (ll==rr) return;
l[y]=l[x]; r[y]=r[x];
int mid=ll+rr>>1;
if (v<=mid) update(ll,mid,l[x],l[y],v);
else update(mid+1,rr,r[x],r[y],v);
}
int query(int L,int R)
{
int ll=1,rr=lim,mid,x,y,tmp=(R-L+1)>>1;
x=root[L-1]; y=root[R];
while (ll!=rr)
{
if (sum[y]-sum[x]<=tmp) return 0;
mid=ll+rr>>1;
if (sum[l[y]]-sum[l[x]]>tmp) rr=mid,x=l[x],y=l[y];
else if (sum[r[y]]-sum[r[x]]>tmp) ll=mid+1,x=r[x],y=r[y];
else return 0;
}
return ll;
}
int main()
{
n=read(); lim=read();
for (int i=1;i<=n;i++)
{
int x=read();
update(1,lim,root[i-1],root[i],x);
}
m=read();
for (int i=1;i<=m;i++)
{
int l=read(),r=read();
int x=query(l,r);
if (!x) puts("no");
else printf("yes %d\n",x);
}
return 0;
}