[POI2014]Couriers
熟悉熟悉模板,其实就是主席树的板子,最后卡一卡空间即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; inline int read(){ int f=1,ans=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } const int N=500001; int n,tmp[N],cnt,a[N],q,tr[N],ls[N*20],rs[N*20],sum[N*20]; void build(int &rt,int l,int r){ rt=++cnt; if(l==r) return; int mid=l+r>>1; build(ls[rt],l,mid),build(rs[rt],mid+1,r); return; } void update(int &rt,int lst,int l,int r,int x){ rt=++cnt;ls[rt]=ls[lst],rs[rt]=rs[lst],sum[rt]=sum[lst]+1; if(l==r) return; int mid=l+r>>1; if(x<=mid) update(ls[rt],ls[lst],l,mid,x); else update(rs[rt],rs[lst],mid+1,r,x); } int ql,qr; int map[N],scc,pos[N],ST[N]; int query(int L,int R,int l,int r){ if(l==r){ bool judge=(sum[R]-sum[L])*2>(qr-ql+1); if(!judge) return 0; return ST[l]; } int mid=l+r>>1; int sl=sum[ls[R]]-sum[ls[L]],sr=sum[rs[R]]-sum[rs[L]]; if(sl>sr) return query(ls[L],ls[R],l,mid); if(sl<sr) return query(rs[L],rs[R],mid+1,r); return 0; } int main(){ n=read(),q=read(); for(int i=1;i<=n;i++) a[i]=tmp[i]=read(); sort(tmp+1,tmp+n+1); int d=unique(tmp+1,tmp+n+1)-(tmp+1); for(int i=1;i<=n;i++) if(!map[tmp[i]]) map[tmp[i]]=++scc,ST[scc]=tmp[i]; for(int i=1;i<=n;i++) a[i]=map[tmp[lower_bound(tmp+1,tmp+n+1,a[i])-tmp]]; build(tr[0],1,d); for(int i=1;i<=n;i++) update(tr[i],tr[i-1],1,d,a[i]); while(q--){ ql=read(),qr=read(); printf("%d\n",query(tr[ql-1],tr[qr],1,d)); } }