C62 可持久化线段树 P3567 [POI2014] KUR-Couriers

视频链接:248 可持久化线段树 P3567 [POI2014] KUR-Couriers_哔哩哔哩_bilibili

 

Luogu P3567 [POI2014] KUR-Couriers

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

void read(int &x){ //快读
  x=0; char c=getchar();
  while(!isdigit(c))c=getchar();
  while(isdigit(c))x=x*10+c-'0',c=getchar();
}
const int N=500005;
#define mid ((l+r)>>1)
int n,m,root[N],tot;
int ls[N*25],rs[N*25],sum[N*25];

void change(int &u,int v,int l,int r,int x){ //点修
  u=++tot;
  ls[u]=ls[v];rs[u]=rs[v];sum[u]=sum[v]+1;
  if(l==r) return;
  if(x<=mid) change(ls[u],ls[v],l,mid,x);
  else change(rs[u],rs[v],mid+1,r,x);
}
int query(int u,int v,int l,int r,int len){ //点查
  if(l==r) return l;
  if(sum[ls[u]]-sum[ls[v]]>len/2)
    return query(ls[u],ls[v],l,mid,len);
  if(sum[rs[u]]-sum[rs[v]]>len/2)
    return query(rs[u],rs[v],mid+1,r,len);
  return 0; //不存在
}
int main(){
  read(n),read(m);
  for(int i=1,x;i<=n;i++){
    read(x);
    change(root[i],root[i-1],1,n,x);
  }
  for(int i=1,l,r;i<=m;i++){
    read(l),read(r);
    printf("%d\n",query(root[r],root[l-1],1,n,r-l+1));
  }
}

 

posted @ 2023-11-09 09:45  董晓  阅读(88)  评论(0编辑  收藏  举报