关闭

【BZOJ 3524】[Poi2014]Couriers 主席树裸题

140人阅读 评论(0) 收藏 举报
分类:

放松一下,直接树上二分就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 500020
using namespace std;
int n,m,ls[maxn*20],rs[maxn*20],s[maxn*20],num,rt[maxn];

void insert(int x,int& y,int l,int r,int id){
	y=++num;ls[y]=ls[x],rs[y]=rs[x],s[y]=s[x]+1;
	if(l==r)return ;
	int mid=l+r>>1;
	if(id>mid)insert(rs[x],rs[y],mid+1,r,id);
	else insert(ls[x],ls[y],l,mid,id);
}
int query(int x,int y,int l,int r,int k){
	if(l==r){
		if(s[y]-s[x]>k)return l;
		else return 0;
	}
	int mid=l+r>>1;
	if(s[ls[y]]-s[ls[x]]>k)return query(ls[x],ls[y],l,mid,k);
	else if(s[rs[y]]-s[rs[x]]>k)return query(rs[x],rs[y],mid+1,r,k);
	else return 0;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int x,i=1;i<=n;i++){
		scanf("%d",&x);
		insert(rt[i-1],rt[i],1,n,x);
	}
	int a,b;
	while(m--){
		scanf("%d%d",&a,&b);
		printf("%d\n",query(rt[a-1],rt[b],1,n,(b-a+1)/2));
	}
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32654次
    • 积分:3503
    • 等级:
    • 排名:第9839名
    • 原创:336篇
    • 转载:2篇
    • 译文:0篇
    • 评论:6条
    最新评论