【BZOJ2223】【COCI2009】PATULJCI
裸的主席树。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=300010,maxv=10000010;
struct President_Tree
{
int sum[maxv];
int ls[maxv],rs[maxv];
int root[maxn];
int n,lim,IDs;
#define mid ((l+r)>>1)
void Build(int l,int r,int lnd,int &nnd,int v)
{
nnd=++IDs;
sum[nnd]=sum[lnd]+1;
if (l==r) return;
if (v<=mid) rs[nnd]=rs[lnd],Build(l,mid,ls[lnd],ls[nnd],v);
else ls[nnd]=ls[lnd],Build(mid+1,r,rs[lnd],rs[nnd],v);
}
int Query(int l,int r,int lnd,int rnd,int v)
{
while (l<r)
{
if (sum[rnd]-sum[lnd]<v) return 0;
if (sum[ls[rnd]]-sum[ls[lnd]]>=v) lnd=ls[lnd],rnd=ls[rnd],r=mid;
else if (sum[rs[rnd]]-sum[rs[lnd]]>=v) lnd=rs[lnd],rnd=rs[rnd],l=mid+1;
else return 0;
}
return l;
}
void Build(int _n,int _lim,int *a) {n=_n;lim=_lim;for (int i=1;i<=n;i++) Build(1,lim,root[i-1],root[i],a[i]);}
int Query(int l,int r) {return Query(1,lim,root[l-1],root[r],((r-l+1)>>1)+1);}
}T;
int a[maxn];
int n,m,lim;
int main()
{
scanf("%d%d",&n,&lim);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
T.Build(n,lim,a);
scanf("%d",&m);
for (int i=1,l,r;i<=m;i++)
{
scanf("%d%d",&l,&r);
int res=T.Query(l,r);
if (res==0) printf("no\n");
else printf("yes %d\n",res);
}
return 0;
}
评论 (0)