【BZOJ1180】【CROATIAN2009】OTOCI
【BZOJ2223】【COCI2009】PATULJCI

【BZOJ3524】【POI2014】Couriers

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

  裸的主席树。注意卡内存。

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=500010,maxv=10000010;

struct President_Tree
{
	int sum[maxv];
	int ls[maxv],rs[maxv];
	int root[maxn];
	int n,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 *a) {n=_n;for (int i=1;i<=n;i++) Build(1,n,root[i-1],root[i],a[i]);}
	int Query(int l,int r)
	{
		int v=((r-l+1)>>1)+1;
		return Query(1,n,root[l-1],root[r],v);
	}
}T;

int a[maxn];
int n,m;

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	T.Build(n,a);
	for (int i=1,l,r;i<=m;i++) scanf("%d%d",&l,&r),printf("%d\n",T.Query(l,r));
	return 0;
}

登录 *


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