3524: [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行,每行对应一个答案。

 

Sample Input

7 5
1 1 3 2 3 4 3
1 3
1 4
3 7
1 7
6 6

Sample Output

1
0
3
0
4

HINT

 

【数据范围】

n,m≤500000

 

可持久化线段树还不用离散化。。。。找子树大小大于(r-l+1)>>1的就好了,找不到就返回0
 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<algorithm>
 7 #include<string>
 8 #include<map>
 9 #include<queue>
10 #include<vector>
11 #include<set>
12 #define inf 1000000000
13 #define maxn 500000+5
14 #define maxm 10000000+5
15 #define eps 1e-10
16 #define ll long long
17 #define for0(i,n) for(int i=0;i<=(n);i++)
18 #define for1(i,n) for(int i=1;i<=(n);i++)
19 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
20 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22 using namespace std;
23 int read(){
24     int x=0,f=1;char ch=getchar();
25     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
26     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
27     return x*f;
28 }
29 int n,m,sz,tot;
30 int root[maxn],ls[maxm],rs[maxm],s[maxm];
31 void insert(int l,int r,int x,int &y,int v){
32     y=++sz;
33     s[y]=s[x]+1;
34     if(l==r)return;
35     ls[y]=ls[x];rs[y]=rs[x];
36     int mid=(l+r)>>1;
37     if(v<=mid)insert(l,mid,ls[x],ls[y],v);
38     else insert(mid+1,r,rs[x],rs[y],v);
39 }
40 int ask(int l,int r,int x,int y,int k){
41     if(s[y]-s[x]<=k)return 0;
42     if(l==r)return l;
43     int mid=(l+r)>>1;
44     if(s[ls[y]]-s[ls[x]]>k)return ask(l,mid,ls[x],ls[y],k);
45     else return ask(mid+1,r,rs[x],rs[y],k);
46 }
47 int main(){
48     //freopen("input.txt","r",stdin);
49     //freopen("output.txt","w",stdout);
50     n=read();m=read();
51     for1(i,n){
52         int x=read();
53         insert(1,n,root[i-1],root[i],x);
54     }
55     for1(i,m){
56         int l=read(),r=read();
57         printf("%d\n",ask(1,n,root[l-1],root[r],((r-l+1)>>1)));
58     }
59     return 0;
60 }
View Code

 

posted @ 2016-07-05 10:02  HTWX  阅读(90)  评论(0编辑  收藏  举报