【bzoj3524/2223】[Poi2014]Couriers
Description
给一个长度为n的序列a。1≤a[i]≤n。
m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。
Input
第一行两个数n,m。
第二行n个数,a[i]。
接下来m行,每行两个数l,r,表示询问[l,r]这个区间。
Output
m行,每行对应一个答案。/*
#include<iostream>
#include<cstdio>
using namespace std;
int sum[10000010],ls[10000010],rs[100000010],root[500010]; 
int n,m,sz;
inline int read()
{
    char ch=getchar();
    while(!(ch>='0'&&ch<='9'))ch=getchar();
    int x=0;
    while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}
    return x;
}
void update(int l,int r,int x,int &y,int v)
{
	y=++sz;
	sum[y]=sum[x]+1;
	if(l==r)
	  return;
	ls[y]=ls[x];
	rs[y]=rs[x];
	int mid=(l+r)>>1;
	if(v<=mid) 
	  update(l,mid,ls[x],ls[y],v);
	else
	  update(mid+1,r,rs[x],rs[y],v);
}
int que(int L,int R)
{
    int l=1,r=n,mid,x,y,tmp=((R-L+1)>>1);
    x=root[L-1];
    y=root[R];
    for(;l!=r;)
      {
      	if(sum[y]-sum[x]<=tmp)
      	  return 0;
      	mid=(l+r)>>1;
      	if(sum[ls[y]]-sum[ls[x]]>tmp)
      	  {
      	  	y=ls[y];
      	  	x=ls[x];
      	  	r=mid;
			}
		else if(sum[rs[y]]-sum[rs[x]]>tmp)
		  {
		  	y=rs[y];
		  	x=rs[x];
		  	l=mid+1;
		  }
		else
		  return 0;
	  }
	return l;
}
int main()
{
	 n=read();m=read();
	for(int i=1;i<=n;i++)
	  {
	  	int x;
	  	x=read();
	  	update(1,n,root[i-1],root[i],x);
	  }
	for(int i=0;i<m;i++)
      {
        int l,r;
      	l=read();
      	r=read();
      	printf("%d\n",que(l,r));
	  }
	return 0;
}*/
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号