您的位置:首页 > 其它

bzoj3524: [Poi2014]Couriers&&2223: [Coci 2009]PATULJCI

2017-08-28 21:46 459 查看
主席树模板题。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
char ch=getchar();int f=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') {f=f*10+(ch^48);ch=getchar();}
return f;
}
int son[10000005][2],sum[10000005],root[500005],n,m,sz;
void add(int x,int &y,int l,int r,int k)
{
y=++sz;
sum[y]=sum[x]+1;
if(l==r)
return;
son[y][0]=son[x][0],son[y][1]=son[x][1];
int mid=l+r>>1;
if(k<=mid)
add(son[x][0],son[y][0],l,mid,k);
else add(son[x][1],son[y][1],mid+1,r,k);
}
int query(int L,int R)
{
int l=1,r=n,mid,x,y,tmp=(R-L+1)>>1;
x=root[L-1],y=root[R];
while(l!=r)
{
mid=l+r>>1;
if(sum[y]-sum[x]<=tmp) return 0;
if(sum[son[y][0]]-sum[son[x][0]]>tmp)
{
r=mid;
x=son[x][0],y=son[y][0];
}
else if(sum[son[y][1]]-sum[son[x][1]]>tmp)
{
l=mid+1,x=son[x][1],y=son[y][1];
}
else return 0;
}
return l;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
int x=read();
add(root[i-1],root[i],1,n,x);
}
for(int i=1;i<=m;i++)
{
int l=read(),r=read();
printf("%d\n",query(l,r));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: