【BZOJ3524】【POI2014】Couriers
【BZOJ1507】【NOI2003】Editor

【BZOJ2223】【COCI2009】PATULJCI

Zarxdy34 posted @ 2016年3月13日 11:35 in BZOJ with tags 主席树 , 370 阅读

  裸的主席树。

 

#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;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter