3524: [Poi2014]Couriers -- 主席树
2024-10-19 00:24:24
3524: [Poi2014]Couriers
Time Limit: 20 Sec Memory Limit: 256 MB
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行,每行对应一个答案。
Sample Input
7 5
1 1 3 2 3 4 3
1 3
1
4
3 7
1 7
6 6
1 1 3 2 3 4 3
1 3
1
4
3 7
1 7
6 6
Sample Output
1
0
3
0
4
0
3
0
4
HINT
【数据范围】
n,m≤500000
#include<cstdio>
#define N 10000010
#define M 500010
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,sz,rt[M],ls[N],rs[N],sum[N];
inline void add(int l,int r,int a,int &p,int v)
{
p=++sz;sum[p]=sum[a]+;
if(l==r)return;
ls[p]=ls[a];rs[p]=rs[a];
int mid=(l+r)>>;
if(v<=mid) add(l,mid,ls[a],ls[p],v);
else add(mid+,r,rs[a],rs[p],v);
}
inline int qwq(int L,int R)
{
int x=rt[L-],y=rt[R],md=(R-L+)>>,l=,r=n,mid;
while(l<r)
{
if(sum[y]-sum[x]<=md) return ;
mid=(l+r)>>;
if(sum[ls[y]]-sum[ls[x]]>md){r=mid;x=ls[x];y=ls[y];}
else if(sum[rs[y]]-sum[rs[x]]>md){l=mid+;x=rs[x];y=rs[y];}
else return ;
}
return l;
}
int x,l,r;
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
{
x=read();
add(,n,rt[i-],rt[i],x);
}
while(m--)
{
l=read();r=read();
printf("%d\n",qwq(l,r));
}
}
最新文章
- Facebook的Web开发三板斧:React.js、Relay和GraphQL
- 剑指Offer-【面试题03:二维数组中的查找】
- javascript曲线图和面积图Line &; Area chart控件功能及下载
- 手把手教你用python打造网易公开课视频下载软件5-python生成exe程序
- Akismet API 密钥(key)免费获取方法
- C# Dictionary几种遍历方式
- 微信接口请求万能函数http_request
- iOS 的 Safari 文件上传功能详解
- iOS NSDate与NSString之间的相互转换
- IOS数据解析JSON
- 【转】Android 实现ListView的滑动删除效果
- 在mac系统安装Apache Tomcat的详细步骤
- 生成php所需要的APNS Service pem证书的步骤
- Java 内部类及其原理
- [SYSS-2018-033]: Fujitsu Wireless Keyboard Set LX901 - Keystroke Injection Vulnerability
- TensorFlow卷积层-函数
- Ubuntu下JDK1.8安装后配置环境变量
- ps/kill/pkill简单应用
- Mybatis拦截器(一)
- [转]动态加载javascript